0

このコードには問題がありますが、コンパイルは問題ありません。しかし、メモリに書き込めませんでしたというエラーが発生した後、すぐにクラッシュします。

デバッガーは、問題が行にあると言います *grid = (grid_t**)malloc(sizeof(grid_t)*GRID_HEIGHT); 、明らかな何かが欠けているに違いありません。

2D 構造体へのポインターを作成しようとしています。

#define GRID_WIDTH 12
#define GRID_HEIGHT 22

typedef struct
{
    int piece;
    int edge;
}grid_t;

grid_t*** grid;

*grid = (grid_t**)malloc(sizeof(grid_t)*GRID_HEIGHT);

for(int i = 0 ; i < GRID_HEIGHT ; i++)
{
    *grid[i] = (grid_t*)malloc(sizeof(grid_t)*GRID_WIDTH);
}
4

1 に答える 1

4

割り当てられていないポインターを逆参照します。

grid_t*** grid;
*grid = (grid_t**)malloc(sizeof(grid_t)*GRID_HEIGHT);

gridは割り当てられない*gridため、未定義の動作です。

2 次元の構造体を動的に割り当てたい場合grid_t*は、まず最初のレベルでポインタ ( ) に十分なメモリを割り当てる必要があります。

grid_t** grid;
grid = malloc(sizeof(*grid) * GRID_HEIGHT);

次に、各要素をループで割り当てることができます。

for(int i = 0 ; i < GRID_HEIGHT ; i++)
{
    grid[i] = malloc(sizeof(**grid) * GRID_WIDTH);
    // ...then you can do grid[i]->piece = 42; etc..
}

さて、私が見る限り、動的割り当てはおそらく必要ありません。必要ない場合mallocは使用せず、代わりに古き良き配列を使用してください。

grid_t grid[GRID_HEIGHT][GRID_WIDTH];
于 2012-12-23T20:52:21.250 に答える