2012-01-05 8 views
27

申し訳ありませんが、私は何奇数使用

...コアオーディオの本を読んで休暇にだし、私のCまたは私とのObjective Cの本を持っていませんこの変数定義で中括弧は何をしていますか? C99標準に従って0recorder構造のすべてのメンバーを初期化する

MyRecorder recorder = {0}; 
+16

ことワイル。必要に応じて、あらゆるタイプのために再帰的に機能します。構造体へのポインタ、ポインタの配列を持つ構造体、... – pmg

+2

pmg:post that that an answer! –

+1

@pmg - 答えとしてあなたのコメントを投稿しなかったのはなぜですか? – vikingosegundo

答えて

22

あなたが想像することができます実はこれもdoubleintのような他のすべてのデータ型で動作し、ポインタ、配列、ネストされた構造、...、すべてのもの(これを指摘するためにPMGのおかげ!)

UPDATE:集約の要素またはメンバーがあるよりも、中括弧で囲まれたリスト で少ない初期化子がある場合

[6.7.8.21]、[:上記のリンク先のウェブサイトから抽出された引用、C99の最終案を引用...]残りの部分はです集合体は、 が静的​​記憶期間を持つオブジェクトと暗黙的に同じに初期化される。

+0

構造体のメンバーにはデフォルト値がありません。ゼロを明示的に使用する方が良いかもしれません。 "すべてのメンバーを(正しい種類の)ゼロに設定します"。 – pmg

+0

@pmg:ありがとう、私はこれを修正した。 –

+0

ああ!クール。それは理にかなっている。ありがとう。 – John

9

その。 0ビットで構造体のすべてのビットを初期化するように見えるかもしれません。しかし、それはすべてのコンパイラでは当てはまりません。

これは出力され

#include<stdio.h> 

struct s { 
    int i; 
    unsigned long l; 
    double d; 
}; 

int main(){ 
    struct s es = {0}; 
    printf("%d\n", es.i); 
    printf("%lu\n", es.l); 
    printf("%f\n", es.d); 
    return 0; 
} 

、このコード例を参照してください。

$ ./a.out 
0 
0 
0.000000 
+1

"レコーダー構造のすべてのメンバーを0に初期化しています。" C99規格が適用されています。 "実際には、構造体のすべてのビットを0ビットで初期化します。"実際のところ、従来のアーキテクチャでのみ真実であり、C99標準は数回指摘しているが、それは真実であるとは言えず、標準準拠のコンパイラ/ターゲットアーキテクチャはそれを真実にする必要はない。 –

+0

@Complicatedseebioありがとう、答えを更新しました。 –

3

an initialization of a structureです。 MyRecorderstruct、このsets every member to their respective representation of zero(整数の0、ポインタなどのためNULL)であると仮定すると

+1

もスカラーである可能性があります: 'MyRecorder recorder = {0};' MyRecorder'は 'int'のエイリアスで、例えばCで有効です。 – ouah

+1

@ouah' struct 'の名前から判断して、それは 'int'または実際には構造体/共用体以外の何かであるとは考えられません。 – dasblinkenlight

0

MyRecorderは、次のいずれかの可能性があり、あなたは実際に、それは最初だけで構造体のすべての要素を、initliazeいないゼロ

typedef struct _MyRecorder1 { 
    int i; 
    int j; 
    int k; 
}MyRecorder1; 

typedef int MyRecorder2[3]; 
3

とそのすべての要素を初期化しようとしています1。しかし、他は自動的に0で初期化されます。これはCの標準が要求するものなのでです。

次のように入力した場合: MyRecorder recorder = {3};

***最初の要素は3であり、そして他のものは、私は `{0} '、***ユニバーサルゼロイニシャライザを呼び出したい0