您的代码是错误的,*arr[i]=(int*)malloc(m*sizeof(int));
因为运算符的优先级[]
高于*
尊重运算符:在表达式*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));
}
要进一步了解上述代码中发生的情况,请阅读此答案。
重要的是,一旦你完成了动态分配的内存,你总是显式地释放它。要释放上述函数分配的内存,您应该这样做:
void deallocate_mem(int*** arr, int n){
for (int i = 0; i < n; i++)
free((*arr)[i]);
free(*arr);
}
此外,创建 2D 数组的更好方法是使用单个函数调用分配连续内存,如下所示: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 仅被调用两次,而不是在循环中调用它。所以这个技术应该更好。