我尝试使用Visual Studio 2005& C在C中释放2D数组。 2008:
void Free_C(int **Cmat)
{
int i;
for (i=0;i<ROW;i++)
free(Cmat[i]);
free(Cmat);
}
当它到达第二个免费线时,它会崩溃,并显示错误:
HEAP CURRUPTION DETECTED:...CRT detected that application wrote to memory after end of heap
我像这样分配了数组:
C=malloc(ROW*sizeof(int*));
for (i=0;i<RC;i++)
C[i]=malloc(COL*sizeof(int));
我也尝试使用calloc
,但会导致相同的错误。
答案 0 :(得分:3)
如果不先了解分配数组的方式,就很难回答这个问题。您发布的代码似乎是正确的,假设数组本身以类似的方式分配。例如(为简洁起见,省略了错误检查)
int** Malloc_C(int row_size) {
int** ppArray = malloc(sizeof(int*) * ROW);
int i;
for (i = 0; i < ROW; i++) {
ppArray[i] = malloc(sizeof(int) * row_size);
}
return ppArray;
}
答案 1 :(得分:0)
在不知道你如何分配数组的情况下,这可能意味着2D数组被分配了第一个指针指向通过malloc()
分配的整个内存缓冲区,指针中的其余指针-array指向内存缓冲区。因此,一旦你在指针数组中的第一个指针上调用free
,你实际上已经释放了整个内存缓冲区...再次在数组中的另一个指针上调用free
将尝试释放已经解除分配的内存。
例如,可以使用以下技术分配数组:
int** ptr_array = malloc(sizeof(int*) * NUM_ROWS);
*ptr_array = malloc(sizeof(int) * NUM_ROWS * NUM_COLUMNS);
int* temp = *ptr_array;
for (int i=0; i < NUM_ROWS; i++)
{
ptr_array[i] = temp;
temp += NUM_COLUMNS;
}