为何仅含柔性数组成员的结构体编译报错?添加冗余成员则正常?
柔性数组成员编译错误的原因
以下代码无法通过编译:
struct array { char concan[]; };
编译时会触发错误:flexible array member in a struct with no named members
只有修改为如下形式,代码才能正常编译运行:
struct array { int x;//some random useless variable char concan[]; };
请问该错误产生的原因是什么?
错误原因解析
这是因为C标准对柔性数组成员有明确的规则限制:
- 柔性数组成员必须是结构体的最后一个成员
- 结构体不能只包含柔性数组成员,必须至少存在一个其他的命名成员
道理很直白:柔性数组成员本身不占用结构体的固定内存空间,它的作用是让结构体在运行时可以动态扩展内存。如果结构体里只有它,编译器根本无法确定结构体的基础大小(总不能是0字节吧),这既不符合C标准的规定,也违背了柔性数组成员的设计初衷——它本来就是作为结构体末尾的动态扩展部分存在的,需要前面的固定成员来支撑结构体的基础结构。
当添加一个普通成员(比如示例里的int x)后,结构体有了确定的基础内存大小,编译器就能正确处理后续的柔性数组成员扩展逻辑,自然就可以正常编译了。
内容的提问来源于stack exchange,提问作者beginner_dumdum2005
相关产品推荐
相关产品推荐

