C语言中如何初始化声明在结构体内部的数组成员?
报错原因
你遇到的E0520029:Expected an expression报错,是由于你使用的嵌入式MCU配套C编译器(通常为8位MCU的C90标准编译器,仅部分支持C99特性)对结构体数组成员的指定初始化语法支持不完整导致的。你当前使用的.数组成员名 = {初始化值列表}是标准C99的合法写法,但你的编译器无法识别这种直接对结构体内部数组整体赋值的初始化格式。
可行的初始化方案
方案1:按结构体成员声明顺序初始化(兼容性最好)
不需要指定成员名,直接按头文件中结构体声明的成员顺序依次写数组初始化列表,所有C标准编译器都支持该写法:
GATE_ACCESS_CTRL_BLOCK g_gate_acc_parameters = { // 对应第一个成员people_in_input_ports的8个元素 {&P12, &P4, &P4, &P4, &P6, &P6, &P6, &P6}, // 对应第二个成员people_out_input_ports的8个元素 {&P14, &P14, &P2, &P14, &P14, &P5, &P5, &P1} };
方案2:指定数组元素索引初始化(保留成员名指定逻辑)
如果需要明确指定成员名避免初始化顺序错误,可以单独给每个数组元素指定索引赋值,该写法也兼容绝大多数老版本嵌入式C编译器:
GATE_ACCESS_CTRL_BLOCK g_gate_acc_parameters = { .people_in_input_ports[0] = &P12, .people_in_input_ports[1] = &P4, .people_in_input_ports[2] = &P4, .people_in_input_ports[3] = &P4, .people_in_input_ports[4] = &P6, .people_in_input_ports[5] = &P6, .people_in_input_ports[6] = &P6, .people_in_input_ports[7] = &P6, .people_out_input_ports[0] = &P14, .people_out_input_ports[1] = &P14, .people_out_input_ports[2] = &P2, .people_out_input_ports[3] = &P14, .people_out_input_ports[4] = &P14, .people_out_input_ports[5] = &P5, .people_out_input_ports[6] = &P5, .people_out_input_ports[7] = &P1 };
额外注意事项
如果修改初始化写法后仍报错,需要检查你使用的SFR宏定义规则:部分编译器的P1、P4等SFR宏本身已经展开为地址常量,不需要额外加取地址符&,删除每个值前的&即可。
内容的提问来源于stack exchange,提问作者Sekar N
相关产品推荐
相关产品推荐

