1. 程式人生 > >C語言結構體初始化出現 too many initializer values 問題

C語言結構體初始化出現 too many initializer values 問題

前一陣子在寫程式的時候發現的一個問題,簡化後的程式碼如下:

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一個元素,所以編譯出錯。