This question already has an answer here:
Closed 3 years ago.
Dynamic memory access only works inside function
(1个答案)
我想写一个函数来改变动态数组的大小,并允许用户立即填充它。我知道我应该用“realloc”来实现它(我做到了,所以它有效……),但是我的第一次尝试看起来是这样的:
函数体“PrintArray(dArray,newSize);”工作正常。
但是当从main()调用时,它会给出如下结果:
-17891602号
-17891602号
-17891602号
-17891602号
看来dArray被释放了。。。?但是我知道分配的内存在退出函数后不会自动释放。
那是什么原因呢?
或者,您也可以只返回新的
此外,对于良好实践,您可能需要not cast the return of
(1个答案)
我想写一个函数来改变动态数组的大小,并允许用户立即填充它。我知道我应该用“realloc”来实现它(我做到了,所以它有效……),但是我的第一次尝试看起来是这样的:
void ChangeDynamicArraySize(int* dArray, int oldSize, int newSize){
int* tempArray = (int*) malloc(sizeof(int) * oldSize);
CopyArray(tempArray, dArray, oldSize);
free(dArray);
dArray = (int*) malloc(sizeof(int) * newSize);
CopyArray(dArray, tempArray, oldSize);
for (int i = oldSize; i < newSize; i++){
scanf("%i", &dArray[i]);
}
PrintArray(dArray, newSize);
free(tempArray);
}
函数体“PrintArray(dArray,newSize);”工作正常。
但是当从main()调用时,它会给出如下结果:
-17891602号
-17891602号
-17891602号
-17891602号
看来dArray被释放了。。。?但是我知道分配的内存在退出函数后不会自动释放。
那是什么原因呢?
最佳答案
在C语言中,函数参数是本地复制的。对值dArray
所做的任何更改都指向(*dArray
)可以工作,但对作为参数传递的dArray
地址所做的任何更改都只是此函数的本地更改,因为它是一个副本。
您可能需要传递数组的地址(main中的a&array
,函数原型中的adArray**
)并更改指针。
像这样的:
void ChangeDynamicArraySize(int** dArray, int oldSize, int newSize){
int* tempArray = (int*) malloc(sizeof(int) * oldSize);
CopyArray(tempArray, *dArray, oldSize);
free(*dArray);
*dArray = (int*) malloc(sizeof(int) * newSize);
CopyArray(*dArray, tempArray, oldSize);
for (int i = oldSize; i < newSize; i++){
scanf("%i", dArray[i]);
}
PrintArray(*dArray, newSize);
free(tempArray);
}
或者,您也可以只返回新的
malloc
ed数组的地址(使您的函数返回这个int*
而不是没有值)。此外,对于良好实践,您可能需要not cast the return of
malloc
,并检查它是否失败和changed ERRNO
(如果您使用POSIX API)。关于c - C使用malloc和memcpy动态更改数组的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39832502/
10-11 21:46