如何在C语言中释放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

我正在尝试为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 (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