【问题标题】:Modify dynamic array through functions通过函数修改动态数组
【发布时间】:2020-07-25 08:12:42
【问题描述】:

我在处理动态数组时遇到了一些麻烦...在下一个代码中,我尝试将n 的每个数字放入一个名为digitList 的数组中。它可以正常工作,因为我可以从 CALL 1(在 createDigitList 函数内)打印数组中的每个值,但我不能从 main 打印。我做错了什么???

int main(int argc, char **argv)
{
    int n = 1234;
    int *digitList;

    createDigitList(n, digitList);
//CALL 2 PRINTF
    printf("Call 2: %d \n", digitList[2]);

    return 0;
}

//returns number of digits (works OK)
int nDigits(int n) {
    int unit;
    int digit = 0;
    while (n != 0) {
        unit = n % 10;
        n = (n - unit )/ 10;
        digit++;
    }
    return digit;
}

//Allocates memory for list and puts every digit inside the array list
void createDigitList(int n, int list[]) {
    int digit, i;
    list = (int*) malloc(nDigits(n)*sizeof(int));
    for (i = nDigits(n)-1; i >=0; i--) {
        digit = n % 10;
        list[i] = digit;
        n = (n - digit )/ 10;

    }
//CALL 1 PRINTF
    printf("Call 1: %d \n", list[2]);
}

输出:

Call 1: 3
Call 2: -2063401279

提前谢谢大家!

【问题讨论】:

  • list 在你的函数中是本地的,所以改变它不会影响 main 中的 digitList,那仍然是一个未初始化的指针
  • tenigram, //returns number of digits (works OK) int nDigits(int n) --> 嗯,你希望 nDigits(0) 返回什么?

标签: c arrays dynamic


【解决方案1】:

你必须通过引用函数createDigitList来传递指针digitList

createDigitList(n, &digitList);

否则函数将处理指针的副本。更改副本不会影响原始指针。

函数本身至少应该声明为

int createDigitList(int n, int **list) {
    int digit, i;
    *list = (int*) malloc(nDigits(n)*sizeof(int));
    //  and so on

函数应该返回分配数组的大小。否则函数的调用者将不知道数组包含多少元素。

请注意函数nDigits也是错误的,因为在将零传递给作为有效数字的函数的情况下,函数将返回0而不是1

当用户提供负数时,程序也会错误地运行。编写一个将整数转换为字符串的函数更有意义。在这种情况下,结果字符串可以包含减号。

这是一个演示程序,展示了如何编写这样的函数。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

size_t nDigits( int n ) 
{
    const int Base = 10;

    size_t count = 0;

    do { ++count; } while ( n /= Base );

    return count;
}

char * createDigitList( int n )
{
    const int Base = 10;
    size_t count = nDigits( n ) + ( n < 0 );

    char *s = calloc( count + 1, sizeof( char ) );

    if ( s != NULL )
    {
        if ( n < 0 ) s[0] = '-';

        do
        {
            int digit = n % Base;
            if ( digit < 0 ) digit = -digit;

            s[--count] = digit + '0';
        } while ( n /= Base );
    }

    return s;
}

int main(void) 
{
    printf( "%d is \"%s\"\n", 0, createDigitList( 0 ) );
    printf( "%d is \"%s\"\n", INT_MIN, createDigitList( INT_MIN ) );
    printf( "%d is \"%s\"\n", INT_MAX, createDigitList( INT_MAX ) );

    return 0;
}

程序输出是

0 is "0"
-2147483648 is "-2147483648"
2147483647 is "2147483647"

【讨论】:

    【解决方案2】:

    要详细了解这一点,应该了解 C 语言参数传递的概念。必须了解 Variable Scope 以及 按值传递按引用传递 的区别。这是一个小介绍on that

    此外,这是将您的程序重新编写为工作程序的方法之一。

    int *createDigitList(int n);
    int nDigits(int n);
    
    int main(int argc, char **argv)
    {
        int n = 1234;
        int *digitList;
    
        digitList = createDigitList(n);
    //CALL 2 PRINTF
        printf("Call 2: %d \n", digitList[2]);
    
        return 0;
    }
    
    //returns number of digits (works OK)
    int nDigits(int n) {
        int unit;
        int digit = 0;
        while (n != 0) {
            unit = n % 10;
            n = (n - unit )/ 10;
            digit++;
        }
        return digit;
    }
    
    //Allocates memory for list and puts every digit inside the array list
    int *createDigitList(int n) {
        int digit, i;
        int *list;
        list = (int*) malloc(nDigits(n)*sizeof(int));
        for (i = nDigits(n)-1; i >=0; i--) {
            digit = n % 10;
            list[i] = digit;
            n = (n - digit )/ 10;
    
        }
    //CALL 1 PRINTF
        printf("Call 1: %d \n", list[2]);
        return list;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2012-06-04
      • 2011-05-06
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多