2016-12-09 19 views
2

例コード:配列は、警告:初期周り欠落括弧

#include <stdio.h> 

typedef struct 
{ 
    unsigned int a, 
    unsigned int b, 
    unsigned int c 
} user_struct; 


int main() 
{ 
    user_struct arr[5] = {0}; // gives warning on compilation 
    return 0; 
} 

上記のコードは以下gcc5.4 に警告を与える警告です。

警告:初期化子

周り行方不明中括弧

私の理解では、私が0に任意のオブジェクトを初期化したい場合、私はちょうど{0}に同一視することができ、ということです。

コンパイラの警告なしに、構造体の配列を0に初期化するにはどうすればよいですか?ありがとう。

+0

を、あなたは、構造体の各メンバに割り当てる必要があります。 – Barmar

+0

'= {{0、0、0}}' – Barmar

+2

{{{0}} 'を試してください。また、 'user_struct'に入力ミスがあります。 – BLUEPIXY

答えて

1

コードの唯一の問題は、各struct要素の後に,の代わりにセミコロン;が必要だということです。

typedef struct 
    { 
     unsigned int a; 
     unsigned int b; 
     unsigned int c; 
    } user_struct; 

あなたの初期化はokです:

user_struct arr[5] = {0}; // this should memset all array elements (here struct) to zero 

警告は、もしあれば、あなたが初期化されますが、あなたのコード内でarrを使用したことがないということだけです。

+1

http:// stackoverflow。com/questions/5434865/quickest-way-to-initialize-an-array-of-all-0s – koper89

+0

リンクに感謝します。 AntTの答えを 'あなたは単純な{0}を使うことができ、それはうまくいくでしょう。 'そして、実際には単一のブラケットを使うと、gccは' -g -std = c11 -pedantic-errors -Wall -Wextra' – artm

+0

gcc version 5.4.0 – artm

1

初心者のために、タイプミスがあります。構造体の最後のデータメンバーの後ろにセミコロンを置くことを忘れて、宣言子を区切るためにカンマを使用するか(bとcの前に型指定子を削除する必要があります)、セミコロンを使用してデータメンバーの宣言を区切ります。例えば

typedef struct 
{ 
    unsigned int a, 
    unsigned int b, 
    ^^^^^^^^^^^^ 
    unsigned int c 
    ^^^^^^^^^^^^ ^^^ 
} user_struct; 

警告については

typedef struct 
{ 
    unsigned int a; 
    unsigned int b; 
    unsigned int c; 
} user_struct; 

を書くことができ、その後、この宣言

user_struct arr[5] = {0};  

は、構造体の配列である凝集体の集計を宣言します。集合体は、中括弧で囲まれたリストで初期化されているものとします。これにより、集約の初期化がより明確になります。コンパイラはあなたが書いてくれると予想します

user_struct arr[5] = { { 0 } }; 

あなたの宣言は正しいです。

0

これを行う最も簡単な方法は、memsetを使用することです。これにより、配列とすべての構造体メンバがクリアされることが保証されます。以下の例を参照してください:あなたは構造体に '0'を割り当てることはできません

memset(arr, 0, sizeof(arr));

関連する問題