用c语言打印动态数组
我尝试从我的用户那里获取数字,这是我的功能 我的函数获取arr作为指针,并将其设置为一个新数组,然后返回要打印的数字的计数器 但是当我试图打印数组时,我得到了一个错误,而这个错误没有被注意到用c语言打印动态数组,c,C,我尝试从我的用户那里获取数字,这是我的功能 我的函数获取arr作为指针,并将其设置为一个新数组,然后返回要打印的数字的计数器 但是当我试图打印数组时,我得到了一个错误,而这个错误没有被注意到 int GetNumber(int *arr) { int n,i=0; int *temp; temp = (int*)calloc(1,sizeof(int)); assert(temp); scanf("%d",&n); while(n != -
int GetNumber(int *arr)
{
int n,i=0;
int *temp;
temp = (int*)calloc(1,sizeof(int));
assert(temp);
scanf("%d",&n);
while(n != -1)
{
i++;
temp = (int*) realloc(temp,i*sizeof(int));
assert(temp);
temp[i-1] = n;
scanf("%d",&n);
}
arr = temp;
return i;
}
问题是您修改了一个局部变量 在C语言中,所有参数都是“按值”传递的,这意味着值被复制到函数的作用域中。指针
arr
也会发生这种情况。如果在函数中修改arr
,这将永远不会影响调用者
解决方案是传递一个指向您要修改的内容的指针,因此您的签名应该如下所示:
int GetNumber(int **arr)
尽管如此,该指针还是按值传递,但它指向要修改的另一个指针
另一方面,不要在C中强制转换
void*
。它可以隐式转换为任何指针类型。问题在于修改了局部变量
在C语言中,所有参数都是“按值”传递的,这意味着值被复制到函数的作用域中。指针arr
也会发生这种情况。如果在函数中修改arr
,这将永远不会影响调用者
解决方案是传递一个指向您要修改的内容的指针,因此您的签名应该如下所示:
int GetNumber(int **arr)
尽管如此,该指针还是按值传递,但它指向要修改的另一个指针
另一方面,不要在C中强制转换
void*
。它可以隐式转换为任何指针类型。您只是在当前堆栈帧上修改指针的地址,而不是在调用堆栈帧上修改指针的地址。您应该使用int**arr
作为参数,realloc使用*arr=realloc(*arr,…)
,从而传递指向int指针的指针,如下所示:GetNumber(&u arr)
不要realloc
,并将返回值分配给原始变量。如果realloc
失败,则原始temp
不会被释放,并且NULL
会被返回并分配给temp
,导致您丢失对temp
所指向内存块的引用,从而导致内存泄漏。而是使用临时指针,例如void*t=realloc(temp,i*sizeof*temp);如果(t)温度=t代码>只修改当前堆栈帧上指针的地址,而不修改调用堆栈帧上指针的地址。您应该使用int**arr
作为参数,realloc使用*arr=realloc(*arr,…)
,从而传递指向int指针的指针,如下所示:GetNumber(&u arr)
不要realloc
,并将返回值分配给原始变量。如果realloc
失败,则原始temp
不会被释放,并且NULL
会被返回并分配给temp
,导致您丢失对temp
所指向内存块的引用,从而导致内存泄漏。而是使用临时指针,例如void*t=realloc(temp,i*sizeof*temp);如果(t)温度=t代码>这里是一个方便的链接,用于malloc
演员阵容(你会发现你需要它一次又一次),这里是一个方便的链接,用于malloc
演员阵容(你会发现你需要它一次又一次),