如何在函数中为二维数组分配动态内存? 我试过这种方式:
int main()
{
int m=4,n=3;
int** arr;
allocate_mem(&arr,n,m);
}
void allocate_mem(int*** arr,int n, int m)
{
*arr=(int**)malloc(n*sizeof(int*));
for(int i=0;i<n;i++)
*arr[i]=(int*)malloc(m*sizeof(int));
}
但它不起作用。
最佳答案
您的代码在 *arr[i]=(int*)malloc(m*sizeof(int));
处是错误的,因为 precedence []
运算符高于 *
遵从运算符:在表达式 *arr[i]
中,第一个 arr[i ]
被评估然后 *
被应用。您需要的是相反的方式(取消引用 arr
,然后应用 []
)。
像这样使用括号:(*arr)[i]
来覆盖运算符优先级。现在,您的代码应如下所示:
void allocate_mem(int*** arr, int n, int m)
{
*arr = (int**)malloc(n*sizeof(int*));
for(int i=0; i<n; i++)
(*arr)[i] = (int*)malloc(m*sizeof(int));
}
要进一步了解上面代码中发生的事情,请阅读 this answer .
重要的是,一旦您完成了对动态分配的内存的使用,就始终显式地释放它。要释放由上述函数分配的内存,您应该这样做:
void deallocate_mem(int*** arr, int n){
for (int i = 0; i < n; i++)
free((*arr)[i]);
free(*arr);
}
此外,创建二维数组的更好方法是 allocate contiguous memory使用单个 malloc()
函数调用如下:
int* allocate_mem(int*** arr, int n, int m)
{
*arr = (int**)malloc(n * sizeof(int*));
int *arr_data = malloc( n * m * sizeof(int));
for(int i=0; i<n; i++)
(*arr)[i] = arr_data + i * m ;
return arr_data; //free point
}
释放内存:
void deallocate_mem(int*** arr, int* arr_data){
free(arr_data);
free(*arr);
}
请注意,在第二种技术中,malloc 仅被调用两次,因此在释放代码中,free 仅被调用两次,而不是在循环中调用它。所以这种技术应该更好。
关于c - 在函数C中分配内存二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062718/