gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:35:06 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com