具有可变数组成员的结构体大小

6

给定

struct Foo {
    uint32_t a;
    uint32_t b[];
};
< p > sizeof(Foo) 是什么?它是实现定义还是未定义行为?答案是否因 C 和 C++ 而异?


3
值得一提的是,在C++中,VLA(变长数组)并不是标准用法,因此你得到的任何结果都将取决于具体的实现。 - NathanOliver
2
http://port70.net/~nsz/c/c11/n1570.html#6.7.2.1p18 - Eugene Sh.
5
@Olaf 为什么你移除了C++标签?这个问题是“C vs C++”。这样做合法或者说合理吗? - Scheff's Cat
2
它与明确询问C和C++之间的区别的问题相冲突(而答案解决了这个问题)-> 标签已恢复。 - user2371524
3
由于 C/C++ 充满未定义和实现定义的行为,因此 printf 函数不会告诉你这些信息。 - Timmmm
显示剩余12条评论
1个回答

7
编译器会忽略灵活数组成员,就像它不存在一样。
C11-§6.7.2.1(p18)
[...]在大多数情况下,灵活数组成员被忽略。特别地,结构的大小就像灵活数组成员被省略一样,除了它可能有比省略所暗示的更多的尾随填充[...]。
据我所知,灵活数组成员直到c++14都不是C++标准的一部分。但是,GNU支持它作为扩展。对于C和C++,行为将是类似的。

1
谢谢!实际上我在C++14中找不到任何关于它的参考资料,但我认为可以安全地假设Clang/GCC等在C++中对其应用与C相同的行为(通过实验似乎是这样)。 - Timmmm
1
@felix: struct { char a; double d[]; };. 如果忽略 d,则大小可能为1。 - rici
1
@rici 是的,这是一个简单的问题,但是请看这里的讨论 ;) (我刚才发现我可能把它和其他引用混淆了...抱歉) - user2371524
@felix 我之前看到了那个讨论,但选择避免加入争论。C标准并不是故意建立虚假期望的业务,也不是一种只有高级祭司才能解开其神秘言论的德尔菲神谕。相反,它是一个旨在使用(和可用)的编程语言描述。标准描述的功能必须是可用的;否则它就不会存在。如果措辞使这成为不可能,那么这是一个缺陷,应该进行纠正;这不会是第一个也不会是最后一个这样的错误... - rici
让我们在聊天中继续这个讨论 - rici
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接