C语言含二级指针的嵌套结构体静态初始化问题
错误原因
你的报错本质是类型不匹配导致的初始化逻辑错误:
s1_t**类型的成员需要接收「指向s1_t*类型元素的指针」,通常对应s1_t*数组的首地址- 你之前写的
&(s1_t *){{ ... }}是错误写法:s1_t*是单个指针标量,不能直接用结构体初始化语法赋值,也不能用两层大括号包裹。
正确实现代码
利用C99标准支持的复合字面量特性(gcc默认支持,你的gcc-11环境完全兼容),可以直接完成初始化,无需额外调用初始化函数:
typedef struct s1_s { int a; int b; } s1_t; typedef struct s2_s { int c; s1_t **s1s; // 存储s1_t指针数组的首地址 // 建议额外加一个成员记录数组长度,避免后续访问越界 // int s1s_cnt; } s2_t; // 头文件中定义请加static修饰,避免多源文件引入时出现重复定义的链接错误 static s2_t *def = &(s2_t){ .c = 10, // s1_t*[] 是指针数组,数组名隐式转换为s1_t**类型,正好匹配成员要求 .s1s = (s1_t*[]){ &(s1_t){.a = 100, .b = 200}, // 每个元素对应一个s1_t实例的指针 // 需要新增配置项直接往后追加即可,示例: // &(s1_t){.a = 300, .b = 400}, }, // .s1s_cnt = 1, // 数组长度和上面的元素个数对应即可 }; int main(void){ return 0; }
补充说明
文件作用域下的复合字面量为静态存储期,整个程序运行周期内都有效,完全满足默认配置变量的存储需求。
内容的提问来源于stack exchange,提问作者bliako
相关产品推荐
相关产品推荐

