使用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
列向量数,从而跳过从未分配的“空闲”列。