c - 在函数C中分配内存二维数组

标签 c arrays function 2d allocation

如何在函数中为二维数组分配动态内存? 我试过这种方式:

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/

相关文章:

c++ - 使用 Rcpp 构建一个 R 包,其中包含带有限制限定符的 C 源代码和 header ?

c - 提高通用交换的性能

c - 数组不返回用户输入的字母

Python - 二维 Numpy 数组的交集

javascript - 如何在 javascript 中用命名函数替换匿名函数?

c - 共享内存段被删除?

c - 解释一下下面的代码?

arrays - 数组中出现频率最高的元素 (bash 3.2)

c++ - 输入不传递到函数中

javascript - 非递归代码递归