2017-04-03 18 views
1

私の意図は、構造体の多次元配列を作成することです。しかし、問題はグローバル変数である必要がありますが、コンパイル時のサイズはわかりません(ユーザー入力です)。私はこのためのグローバルな多次元配列を宣言する必要がCでの構造体と多次元配列のグローバル宣言

typedef struct abc abc; 
struct abc { 
    int test; 
    char* color; 
}; 

は、私はそうのような構造体を持っているとしましょう。関数内で

abc** board; 

以降のコードでは、私は、サイズを初期化し、値でそれを埋めるためにしたい:

私は間違っているつもりです
board[height][width]; 

for(int i = 0; i < height; i++) { 
    for(int x = 0; x <width; x++) { 
     board[i][x].test = 0; 
    } 
} 

?この部分が問題であるようです:board [height] [width]?

malloc関数は、ボードにメモリを割り当てるために使用することができ、それはボードを使用してアクセスすることができる@xingで答える

+0

'abc ** board;'は配列のどこにもありません。 –

+0

OK、理由を説明できますか? @SouravGhosh – Alex

+0

配列はポインタではなく、その逆もあります。 –

答えて

0

これを行うには2通りの方法があります。最初の段階は、どちらの場合も同じです。abcへのポインタの配列を割り当てます(ユーザーがすでに高さと幅の値を入力しており、それらを検証したと仮定します)。

board = calloc(height, sizeof *board); 

今、あなたは(純粋主義者は、これはC標準で保証されていないと言うだろうが、それは問題ではありませんので、我々はそれらを無視します)heightヌルポインタの配列を持っています。今

、あなたがwidth構造体

for (size_t i = 0 ; i < height ; ++i) 
{ 
    board[i] = calloc(width, sizeof **board); 
} 

height配列を割り当てるか、あなたは全部のための1つの巨大な配列をalllocate、右のオフセットにボードにポインタを設定するのいずれか。

abc *temp = calloc(width * height, sizeof *board); 

for (size_t i = 0 ; i < height ; ++i) 
{ 
    board[i] = &temp[i * width]; 
} 

callocの使用は、各構造体がすでにほとんどのプラットフォームで、testが0とcolorは、アレイ内のすべての単一abcにNULLポインタであろうであろうことを意味し、ゼロのビットパターンで初期化されることを意味します。

2番目のオプションはもう少し不透明ですが、割り当てをたくさん行う必要がある場合、またはheightが大きいと思われる場合はより効率的です。割り当てを解除することも簡単です。free()への呼び出しを2回だけ行うだけです。

このグローバルアレイが一度割り当てられ、プログラム全体の有効期間がある場合は、プログラムの実行中にすべてのメモリがOSに返されるため、解放することを心配する必要はありませんとにかく終了します(仮想メモリのない埋め込みプラットフォームやレトロな環境でない限り)

0

[X] [Y]表記

ボード=のmalloc(高さ*のはsizeof(*ボード) );ループでは、memoryをboard [i] = malloc(width * sizeof(** board));として割り当てます。構造体には割り当てが必要なchar *もあります