0

地球上の各緯度経度セルのいくつかのパラメーターを含む構造 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);

ただし、これは機能しないようです。何を変更すればよいですか?ありがとう!

4

1 に答える 1

0

(malloc_2d()コピーペースト?) 関数は正しく記述されているようですが、ここに掲載されている残りのコードは完全にナンセンスです ...

Enter code here を使用して、あなたがやりたいと思っていたことと同様の実際の例をここに投稿しますmalloc_2d()。C のポインターの基本的な考え方が理解できるまで、いろいろ試してみることをお勧めします。

また、コードについて (明確な) 質問をしてください。

#include <stdio.h>
#include <stdlib.h>

#define NROWS 8
#define NCOL 6

struct GLOBE {
  double **var;
};

void** malloc_2d (size_t nrows, size_t ncols, int elementsize)
{
        // code posted
}

void free_2d (void ** ptr, size_t n_rows)
{
    int i;

    // free the "big part"
    free(ptr[0]);

    // free the array of pointers to the rows
    free(ptr);
}

int main()
{
    struct GLOBE gl;
    int i, j;

    gl.var = (double **)malloc_2d(NROWS, NCOL, sizeof(double));

    for (i = 0; i < NROWS; ++i) {
        for (j = 0; j < NCOL; ++j) {
            gl.var[i][j] = i * j;
            printf("%0.1f ", gl.var[i][j]);
        }
        printf("\n");
    }

    free_2d((void **)gl.var, NROWS);

    return 0;
}
于 2012-11-10T00:14:17.793 に答える