2012-01-23 16 views
1

教授から私が以前に見たことのないコードをいくつか与えました。私は下級レベルの教授に迷惑をかける前に、デュー・ディリジェンスをやろうとしています。構造体を配列で初期化する

まず、構造が定義されます。

struct entry { 
    char *lexptr; 
    int token; 
}; 

次に、配列が定義され、初期化されます。

struct entry keywords[] = { 
    "div", DIV, 
    "mod", MOD, 
    0 , 0 
}; 

どこDIVMOD#defineディレクティブです。私の驚きには、すべてがコンパイルされ実行されます。

個人的に、私が行っていると何かの初心者のような..

struct entry keywords[3]; 

keywords[0]->lexptr="div"; 
keywords[0]->token=DIV; 
//and so on 

私の最初の質問は、それがそのinitメソッドの仕事をしないかのようにされて?私の推測では、配列のアドレス位置は、構造体で定義された要素の順序と一致しています。したがって、要素定義{"div", DIV,"mod", MOD, 0 , 0};は、アドレスレベルにentryという3つの要素をうまく収めます。

私の2番目の質問は、これは正常ですか?なぜこの方法は、配列を初期化する私のsligltyより読みやすく、より冗長なバージョンですか?最初の方法に利点はありますか?

+3

初期設定の構文については、教科書に説明されています。はるかにクリーンで読み易く、配列内の要素数を数える必要がなくなります。私は個人的には、イニシャライザの各構造体の周りに常に{{} 'の追加レベルを追加します。 –

答えて

5

それが書かれた場合、それは好ましいかもしれない:

各サブ構造の周りに括弧を使用して(そしておそらくアレイ上ならびに構造定義のポインタに constがあるはず)
const struct entry keywords[] = 
{ 
    { "div", DIV }, 
    { "mod", MOD }, 
    {  0, 0 } 
}; 

これは構造体の静的配列を初期化する方法であり、ローカル配列の初期化にも使用できます。

また、C99に、あなたは指定された初期化子使用することができます、この例では

const struct entry keywords[] = 
{ 
    [0] = { .lexptr = "div", .token = DIV }, 
    [1] = { .lexptr = "mod", .token = MOD }, 
    [2] = { .lexptr =  0, .token = 0 } 
}; 

を、表記法への利点は(私はそれを使用することはありません)がありませんが、より複雑なケースでは、おそらく構造体内の多くのフィールドのほんの少数だけが各行で初期化される必要があります。指定された初期化子には利点があります。イニシャライザを順不同にすることもできます。繰り返しますが、ここでは使用しませんが、エントリにenumがある場合は、ENUMXとENUMYに対応する数字を知らずに[ENUMX] = { ... }, [ENUMY] = { ... }, ...を使用してください。(注:私は、メンバー指定なしでインデックス指定を使用したり、インデックス指定なしのメンバー指定を使用していた可能性がありますが、オプションの範囲を示すために両方を示しました。それはあなたが代わりとして示すものです。静的または大域配列の初期化は、プログラムがロードされるときにシステムによって実行されるため、実行時間が短縮され、実行可能ファイル内のコード量が減少します(両方とも望ましい)。また、実行時に変更することができないように、構造を一定にすることもできます。割り当ては、構造を変更可能にする必要があります。

+0

非常に役に立ち、ありがとう! –

1

これは構造体の配列を初期化する別の方法です。はい、あなたのインジシアライザーで与えられた要素は、構造体が定義された順番になっています。まず、char*(本質的には文字列)、次にintです。それで、あなたは同じパターンで次の構造を持っています。

これは、structまたは構造体の配列さえも初期化するより簡潔な方法です。

これを書く方法は、実際には、1日の終わりには優先事項です。

明らかに少ないタイピングを除いて、それ自体の利点はわかりません。

+0

あなたの書き方は重要です。使用可能なときはいつでもイニシャライザは実行可能コードよりも優れています。 –

1

メモリの魔法のようなオーバーレイではありませんが、標準で設計されています。つまり、正しく構造体をパッキングすることに対応します。それは単に構造体の配列を初期化する方法です:-)それは多くの一般的な、単に味の問題です。どのように書かれているかには何も問題はありません。もっと明示的であり、構造体の順序付けの知識を必要としないので、読みやすくなるかもしれないと思います。

+0

あなたの書き方は重要です。使用可能なときはいつでもイニシャライザは実行可能コードより優れています。 –

+0

True!私はあなたにそれを与えるだろう、私は完全にそれらを無視した。 – Joe

関連する問題