使用void在C中分配和释放2D数组

时间:2014-03-16 17:10:02

标签: c malloc multidimensional-array

这个想法是只使用两个函数来分配和释放给定数据类型的2D数组,这些数组在编译时是未知的。我写的代码在释放函数中崩溃,但我不明白为什么。这是代码:

void** new2DArray(int row, int col, int typeSize){
    void** temp = malloc(sizeof(void*)*row); //EDIT                     
    for (row-=1; row >= 0; row--)                               
        temp[row] = malloc(typeSize*col);
    return temp; 
}


void free2DArray(void** array, int row, int typeSize){
    for (row -= 1; row >= 0; row--)
        free( *(array + row*typeSize) );
     free(array); 
}

对于3x3阵列,将被称为:

double** test = (double**) new2DArray(3, 3, sizeof(double));
free2DArray(test, 3, sizeof(double));

释放功能有什么问题吗?

3 个答案:

答案 0 :(得分:3)

free2DArray看起来不对劲。你不需要知道类型的大小;你只需释放你分配的块:

void free2DArray(void** array, int row){
    for (row -= 1; row >= 0; row--)
        free( array[row] );
     free(array); 
}

答案 1 :(得分:1)

您使用free(*(array + row*typeSize));释放列数组。但是,它应该是free(*(array + row)),或更简洁,free(array[row])array + row*typeSize使您每次迭代都跳过typeSize个列向量,因此,从未分配的“空闲”列。

答案 2 :(得分:1)

为什么不像分配它一样释放它?

for (row-=1; row >= 0; row--)                               
        free(array[row]); 
      //free(*(array + row)); <- or the way you are doing it
free(array);