在C中释放2D数组的问题

时间:2011-08-10 15:52:12

标签: c arrays free

我尝试使用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,但会导致相同的错误。

2 个答案:

答案 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;
}