我正在尝试为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]);
答案 0 :(得分:3)
您似乎正在尝试将一个指针数组分配给数组。因为free
未分配的内存,所以代码段出错。分配“ 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);
答案 1 :(得分:2)
一个简单的经验法则是,每个malloc
应该有一个free
。您已经分配了arr1
所指向的内存块,因此您应该释放该一个内存块。
free(arr1);
您不能零碎地释放一块内存。如果要这样做,则需要分别分配每一行,但也可以将单个内存作为2D数组使用。如果每行的大小未知,则分配每行更好。如果行大小固定,则较大的分配会更好。
此外,arr1
应该是单指针,而不是双指针。编译器警告应该已经对此发出警告。
int *arr1 = malloc (rows * columns * sizeof(int));
double pointer是指向指针的指针。不必使用双指针来假装指针是2D矩阵。
答案 2 :(得分:1)
您可以遍历每一行,并在每次迭代时,可以在创建阶段分配空间,并在清除阶段自行释放空间。您的代码有几个问题,我认为这可能是一种更好的编写方式,例如:
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;
}
}
这将创建二维数组,其值按升序排列。
释放时:
for(i = 0 ; i < row; i++){
free(*(array + i));
}
free(array);