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

我们的想法是只使用两个函数来分配和释放给定数据类型的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); } 

其中,对于3x3arrays,将被称为:

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

释放function有什么问题吗?

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

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

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

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

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