如何在C语言中释放2D数组内存
我正在尝试为2D数组分配内存。但是当我试图释放内存时,它抛出了分段错误。请帮助我知道我做错了什么如何在C语言中释放2D数组内存,c,arrays,pointers,heap-memory,C,Arrays,Pointers,Heap Memory,我正在尝试为2D数组分配内存。但是当我试图释放内存时,它抛出了分段错误。请帮助我知道我做错了什么 int **arr1 = (int **) malloc (rows * columns * sizeof (int)); //Array Access: for (i = 0; i < rows; i++) for (j = 0; j < columns; j++) *(arr1 + i * columns + j) = ++count; for
int **arr1 = (int **) malloc (rows * columns * sizeof (int));
//Array Access:
for (i = 0; i < rows; i++)
for (j = 0; j < columns; j++)
*(arr1 + i * columns + j) = ++count;
for (i = 0; i < rows; i++)
for (j = 0; j < columns; j++)
printf ("%d", *(arr1 + i * columns + j));
for (i = 0; i < rows*columns; i++)
free (arr1[i]);
int**arr1=(int**)malloc(行*列*大小(int));
//阵列访问:
对于(i=0;i
看起来您正在尝试将指针数组分配给数组。由于释放了未分配的内存,代码段出现故障。分配“2D数组”的正确方法更像这样:
int **arr1 = malloc (rows * sizeof (int*));
for (int r = 0; r < rows; r++)
arr1[r] = malloc(columns * sizeof(int));
...
for (int r = 0; r < rows; r++)
free(arr1[r]);
free(arr1);
int**arr1=malloc(行*sizeof(int*);
对于(int r=0;r
看起来您正在尝试将指针数组分配给数组。由于释放了未分配的内存,代码段出现故障。分配“2D数组”的正确方法更像这样:
int **arr1 = malloc (rows * sizeof (int*));
for (int r = 0; r < rows; r++)
arr1[r] = malloc(columns * sizeof(int));
...
for (int r = 0; r < rows; r++)
free(arr1[r]);
free(arr1);
int**arr1=malloc(行*sizeof(int*);
对于(int r=0;r
一个简单的经验法则是,每个malloc
都应该有一个免费的。您已经分配了一个arr1
指向的内存块,因此应该取消分配该内存块
free(arr1);
你不能零碎地释放一块内存。如果您想这样做,您需要单独分配每一行,但是使用单个内存块作为2D数组也可以。如果每行的大小未知,则分配每行会更好。如果行大小固定,则一个大的分配更好
此外,arr1
应该是单指针,而不是双指针。编译器警告应该警告您这一点
int *arr1 = malloc (rows * columns * sizeof(int));
是指向指针的指针。不必制作双指针来假装指针是2D矩阵。一个简单的经验法则是,每个malloc
都应该有一个免费的。您已经分配了一个arr1
指向的内存块,因此应该取消分配该内存块
free(arr1);
你不能零碎地释放一块内存。如果您想这样做,您需要单独分配每一行,但是使用单个内存块作为2D数组也可以。如果每行的大小未知,则分配每行会更好。如果行大小固定,则一个大的分配更好
此外,arr1
应该是单指针,而不是双指针。编译器警告应该警告您这一点
int *arr1 = malloc (rows * columns * sizeof(int));
是指向指针的指针。不必制作双指针来假装指针是2D矩阵。您可以在每一行上循环,在每次迭代中,您可以在创建阶段分配空间,在清除阶段自己释放空间。您的代码有几个问题,我认为这可能是一种更好的方法,可以用如下形式编写:
int **array = (int**) malloc( row * sizeof(int*)), i = 0, j;
for( ; i < row; i++){
*(array + i) = (int*) malloc(col * sizeof(int));
for( j = 0; j < col; j++){
*(*(array + i) + j) = i * row + j;
}
}
int**array=(int**)malloc(row*sizeof(int*)),i=0,j;
对于(;i|
这将创建具有递增顺序的值的二维数组
释放时:
for(i = 0 ; i < row; i++){
free(*(array + i));
}
free(array);
(i=0;i{
自由(*(数组+i));
}
自由(数组);
|
您可以在每一行和每一次迭代中循环,您可以在创建阶段分配空间,在清除阶段自己释放空间。您的代码有几个问题,我认为这可能是一种更好的方法,可以用如下形式编写:
int **array = (int**) malloc( row * sizeof(int*)), i = 0, j;
for( ; i < row; i++){
*(array + i) = (int*) malloc(col * sizeof(int));
for( j = 0; j < col; j++){
*(*(array + i) + j) = i * row + j;
}
}
int**array=(int**)malloc(row*sizeof(int*)),i=0,j;
对于(;i|
这将创建具有递增顺序的值的二维数组
释放时:
for(i = 0 ; i < row; i++){
free(*(array + i));
}
free(array);
(i=0;i{
自由(*(数组+i));
}
自由(数组);
|
如果你做了一个malloc
,你就做了一个free
。因此,将费用循环替换为单个语句free(arr1)代码>。当我尝试只使用“free(arr1)”时,我得到了以下错误**错误in
/home/a.out::free():无效的下一个大小(快速):0x00000000019a6010***123456789中止(内核转储)”,但是,如果我使用`int*arr1=(int*)malloc(rows*columns*sizeof(int));`与双指针不同,您的解决方案工作得非常好。您能告诉我为什么它不适用于双指针的情况吗?使用int**arr
将让编译器解释*(arr1+i*columns+j)
与指针一样,因此i*columns
意味着i*sizeof(int*)*columns
字节,这不同于i*sizeof(int)*columns
字节在sizeof(int*)!=sizeof(int)
平台上,尤其是64位平台上。为什么不改用线性数组然后free(array)
在它的末尾使用?y*width+x
访问[y][x]上的元素
对于客观上比你的问题中的代码更可读的分配、使用和解除分配来说,这是一个很小的代价。如果你做了一个malloc
,你就做了一个free
。因此,当我试图只使用“free”(arr1)时,用一个语句来代替费用循环“,我在
/home/a.out中遇到以下错误:”:free():下一个大小无效(快速):0x00000000019a6010***123456789A