2015-10-15 110 views
-2

我想在一行中聲明和初始化結構數組。但它看起來不像我們在數組中那樣受到支持。在下面的代碼中,myStructArray[3]給出錯誤,而myStructArray2[3]工作正常。爲什麼在一個線路初始化不允許(我知道這是不是一個好的做法做,但還是想知道是否有任何理由。)結構數組的單線初始化

typedef struct myStruct 
{ 
     int structMemInt; 
     char structMemChar; 
}MYSTRUCT; 

int main (void) 
{ 
    struct myStruct myStructArray[3] = {2,'a',5,'b',7,'c'}; 

    struct myStruct myStructArray2[3] = { 
     {2,'a'}, 
     {5,'b'}, 
     {7,'c'}, 
    }; 
} 

更新時間:

這裏的要點是關於一個對每個數組成員和大括號沒有單獨的大括號。這意味着爲什麼它不適用於{2,'a',5,'b',7,'c'},爲什麼它必須包括大括號{{2,'a'},{5,'b'},{7,'c'}}

我正在比較行爲與多維數組,其中我們不需要用花括號將每行數據分開。 這個懷疑開始是因爲Byron Gottfried編寫的理論和問題(Schaum概要系列)在例9.16(我有任何版本)中對多維數組部分的解釋如下。所以這意味着就二維數組初始化而言,這本書在錯誤方面是錯誤的。

int values[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 

enter image description here

而且更多的書(我沒有書細節,我從網上得到)說,類似的方法(附後第二張照片)

enter image description here

+2

它與行數沒有任何關係..如果你要提供oneliner作爲{{2,「a」} ...}(注意{}的額外級別,它應該工作相同。 –

+0

@KarthikT:對不起,我的問題還不清楚,更新了問題 –

+1

所以你找到了一種可行的方法,一個不行,你已經意識到它不是換行符,而是缺失的大括號導致了差異那麼,什麼問題? – 5gon12eder

回答

2

因爲你聲明一個結構類型數組。該數組的每個位置都包含兩個類型數據,一個是整數,另一個是char。您可以通過這種方式

myStructArray2[0].structMemInt=2; 
myStructArray2[0].structMemChar='a'; 
myStructArray2[1].structMemInt=5; 
myStructArray2[1].structMemChar='b'; 
myStructArray2[2].structMemInt=7; 
myStructArray2[2].structMemChar='c'; 

或者

struct myStruct myStructArray2[3] = { 
     {2,'a'}, // location 0 
     {5,'b'}, // location 1 
     {7,'c'}, // location 2 
    }; 

struct myStruct myStructArray[3] = {2,'a',5,'b',7,'c'}; 

這是不正確的訪問的每個位置。聽到您嘗試插入6個不存在於您的結構聲明中的項目。

我想現在你明白了你的觀點。