c-通过函数修改动态数组



我在处理动态数组时遇到了一些问题。。。在下一个代码中,我尝试将n的每个数字放入一个名为digitList的数组中。它工作正常,因为我可以从CALL1(在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

提前感谢大家!

要详细理解这一点,应该理解C语言参数传递概念。必须了解变量范围传递值通过参考的差异。这里有一个关于的小介绍

此外,这里还有一种将程序重新写入工作程序的方法。

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;
}

您必须通过引用函数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"

最新更新