2011-12-19 105 views
3
struct SampleStruct { 
    int a; 
    int b; 
    float c; 
    double d; 
    short e;  
}; 

對於這樣一個數組,我用如下初始化:如何初始化結構數組?

struct SampleStruct sStruct = {0}; 

我想知道我什麼時候宣佈這個結構的陣列,我認爲這是正確的

struct SampleStruct sStructs[3] = {{0},{0},{0}}; 

但是,下面也得到了編譯器所接受

struct SampleStruct sStructs[3] = {0}; 

我想要知道最好,最安全的方式和詳細的理由。

+1

請告訴我們你得到了什麼錯誤,以及你使用的是什麼編譯器。 「它給我一個錯誤」就像泥巴一樣清晰。 – 2011-12-19 17:14:00

回答

4
$ gcc --version 
gcc (GCC) 4.6.1 20110819 (prerelease) 

如果使用-Wall選項,我的海灣合作委員會給了我關於第三個警告:

try.c:11:9: warning: missing braces around initializer [-Wmissing-braces] 
try.c:11:9: warning: (near initialization for ‘sStruct3[0]’) [-Wmissing-braces] 

表明你應該寫= {{0}}初始化,其中第一個結構的第一個字段設置爲0,所有其餘的隱含到0。該程序在這個簡單的例子中給出了正確的結果,但我認爲你不應該依賴這個並需要正確地初始化事物。

1

gcc-4.3.4不會給前兩個聲明帶來錯誤,而會給第三個聲明帶來錯誤。

struct SampleStruct sStruct1 = {0};工作,因爲在這種情況下0是字段a的值。其餘的字段被隱式地初始化爲零。

struct SampleStruct sStructs2[3] = {{0},{0},{0}};的工作原理是因爲你在這裏做的是聲明三個結構並初始化它們中每一個的字段'a'爲零。其餘的字段被隱式地初始化爲零。

struct SampleStruct sStructs3[3] = {0};不起作用,因爲在大括號內,編譯器期望看到與三個結構相對應的東西,而數字零就是不對。

+0

有趣的是,我現在去ideone.com再次嘗試這個,以添加更多關於我得到的錯誤的信息,並且它都編譯時沒有任何錯誤。我猜想ideone的警告級別已經改變,但我無法控制它。 – 2011-12-20 14:50:21