地球上の各緯度経度セルのいくつかのパラメーターを含む構造 GLOBE があります。次のようなトリプルポインターがあります。
data->map = (struct GLOBE ***)malloc_2d(NROWS, NCOL, sizeof(struct GLOBE *));
struct GLOBE {
double *var;
};
ここで、malloc_2d は、以下で定義される 2 次元配列を割り当てるためのカスタム関数です。map はすべての GLOBE を反復処理できます。
void** malloc_2d (size_t nrows, size_t ncols, int elementsize) {
size_t i;
void ** ptr;
if ( (ptr = (void**)malloc(nrows * sizeof(void *))) == NULL ) {
fprintf(stderr, "malloc_2d: out of memory\n");
exit(1);
}
if ( (ptr[0] = malloc(nrows * ncols * elementsize)) == NULL ) {
fprintf(stderr, "malloc_2d: out of memory\n");
exit(1);
}
for (i=1; i<nrows; i++)
ptr[i] = (char*)ptr[0] + i * ncols * elementsize;
return ptr;
}
GLOBE には、他の動的に割り当てられた 1D および 2D 配列があります (例: double *var)。そのため、すべての GLOBE と各 GLOBE 内で動的に割り当てられたメモリの割り当てを解除する必要がある場合、エラーが発生します。
具体的には、次のことを試みます。
for(size_t i = 0; i < data->n_lat; i++)
for(size_t i = 0; i < data->n_lat; i++) {
free(data->map[i][j]->var);
free(data->map);
ただし、これは機能しないようです。何を変更すればよいですか?ありがとう!