如何定义并初始化包含结构体数组的C语言结构体
问题根因
- 你定义的
mainStruct中SS1、SS2是指针类型,无法直接接收结构体数组字面量的初始化赋值 - 初始化时使用的
SS1:是非标准的GNU扩展语法,标准C需要使用.成员名 =的指定初始化器写法 - 未明确数组长度,运行时访问数组元素存在越界风险
正确实现方案
如果你需要将其作为全局常量使用,最稳妥的方式是将主结构体的指针成员修改为固定长度的数组成员,示例代码如下:
#include <stdio.h> typedef struct{ char a; char b; } subStruct1; typedef struct{ char c; char d; }subStruct2; typedef struct{ // 直接定义为固定长度数组,不需要额外指针寻址 subStruct1 SS1[2]; subStruct2 SS2[2]; } mainStruct; // 标准C指定初始化器写法 const mainStruct MS = { .SS1 = {{'a', 'b'}, {'A', 'B'}}, .SS2 = {{'c', 'd'}, {'C', 'D'}} }; int main() { printf("%c %c %c",MS.SS1[0].a,MS.SS1[1].b,MS.SS2[1].c); // 输出结果:a B C return 0; }
如果你必须保留主结构体的指针成员定义,可以先定义静态的子结构体数组,再将数组首地址赋值给指针:
#include <stdio.h> typedef struct{ char a; char b; } subStruct1; typedef struct{ char c; char d; }subStruct2; // 先定义静态数组存储子结构体内容 static subStruct1 ss1_arr[] = {{'a', 'b'}, {'A', 'B'}}; static subStruct2 ss2_arr[] = {{'c', 'd'}, {'C', 'D'}}; typedef struct{ subStruct1 *SS1; subStruct2 *SS2; } mainStruct; const mainStruct MS = { .SS1 = ss1_arr, .SS2 = ss2_arr }; int main() { printf("%c %c %c",MS.SS1[0].a,MS.SS1[1].b,MS.SS2[1].c); return 0; }
内容的提问来源于stack exchange,提问作者andz
相关产品推荐
相关产品推荐

