ser*_*hii 14 c arrays 2d allocation function
如何在函数中为2d数组分配动态内存?我试过这种方式:
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));
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
Gri*_*han 27
您的代码是错误的*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));
}
Run Code Online (Sandbox Code Playgroud)
要进一步了解上述代码中发生的情况,请阅读此答案.
重要的是,一旦完成动态分配内存,就必须明确地释放动态分配的内存.要释放上述函数分配的内存,您应该这样做:
void deallocate_mem(int*** arr, int n){
for (int i = 0; i < n; i++)
free((*arr)[i]);
free(*arr);
}
Run Code Online (Sandbox Code Playgroud)
另外,创建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
}
Run Code Online (Sandbox Code Playgroud)
要释放这个记忆:
void deallocate_mem(int*** arr, int* arr_data){
free(arr_data);
free(*arr);
}
Run Code Online (Sandbox Code Playgroud)
请注意,在第二种技术中,malloc仅被调用两次,因此在释放代码中,free仅被调用两次而不是在循环中调用它.所以这种技术应该更好.