C語言結構體初始化出現 too many initializer values 問題
阿新 • • 發佈:2019-02-14
前一陣子在寫程式的時候發現的一個問題,簡化後的程式碼如下:
int a; void fun1() { a=1; } void fun2() { a=2; } void fun3() { a=3; } typedef void (*MenuFun)(void); typedef struct{ char *caption; MenuFun menuFun; }MenuItem; typedef struct{ MenuItem menuItem[3]; }Menu; Menu myMenu={ {"hello",fun1}, {"wrold",fun2}, {"!",fun3} }; main() { ; }
編譯時好現了一個Error: too many initializer values,其怪的是把初始化時第下個MenuItem 的大括號去掉,即改成下面這樣就沒報錯,並且程式能正常執行
Menu myMenu={
"hello",fun1,
{"wrold",fun2},
{"!",fun3}
};
後來仔細一想就明白了,首先Menu是一個結構體,所以在給他賦初值時是下面的格式
Menu myMenu=
{
Menu結構體第1個元素menuItme[3]的初值
(PS: menuItem 是 MemuItem陣列,在這裡稱他為Memu的元素不知道好不好,我一時不知道怎麼叫,如果你知道的話麻煩告訴我,謝了)
};
Menu結構體之內又只有一個元素 menuItem,它是一個 MemuItem陣列所以給,myMenu賦初值時是格式可以細化為
Menu myMenu=
{
{
/*menuItme[0]的初值*/,
/*menuItme[1]的初值*/,
/*menuItme[2]的初值*/
}
};
因為menuItme的元素是MenuItem結構體型別,所以myMenu賦初值時是格式可以細化為
Menu myMenu=
{
{
{/*caption值*/,/*menuFun值*/},
{/*caption值*/,/*menuFun值*/},
{/*caption值*/,/*menuFun值*/},
}
};
由此可見上面的初始化應該是改為下面才對
Menu myMenu={ { {"hello",fun1}, {"wrold",fun2}, {"!",fun3} } };
與正確寫法相比只是多了一層大括號,當少了那個大括號號時編譯器把第一個{caption值,menuFun值}作為memuItem陣列初值,而不是menuItem第一個元素初值。由於Menu中只有menuItem一個元素,所以編譯出錯。