在函数C中分配内存2d数组

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仅被调用两次而不是在循环中调用它.所以这种技术应该更好.