【发布时间】:2015-10-20 21:17:39
【问题描述】:
#include <iostream>
using namespace std;
struct node1{
char b[3];
int c[0];
};
struct node2{
int c[0];
};
struct node3{
char b[3];
};
int main() {
cout << sizeof(node1) << endl; // prints 4
cout << sizeof(node2) << endl; // prints 0
cout << sizeof(node3) << endl; // prints 3
}
我的问题是为什么编译器在 node2 中为 int c[0] 分配 0 个字节 但在 node1 的一部分时为其分配 1 个字节。 我假设这 1 个字节是 sizeof(node1) 返回 4 的原因,因为没有它(如在 node3 中)它的大小为 3 还是由于填充??
还试图理解 node2 不应该有足够的空间来保存指向数组的指针(将在代码的更下方作为灵活数组/结构黑客的一部分分配?
【问题讨论】:
-
@BaummitAugen:嗯,我觉得很傻。可以复制:coliru.stacked-crooked.com/a/f1a26629a75b8d01
-
假设:
node1具有填充以确保node1和node1.c在 4 字节边界上对齐,因为int具有 4 字节对齐要求。大小为 0 的数组没有特殊情况,因此不会忽略int c[0]。 -
由于零长度数组在 C++ 中不是一个东西,请告诉我们你在说什么 C++ 方言。
-
你用的是什么编译器? MSVC 为
sizeof(node2)给出 1,但警告说 0 大小的数组是非标准的。所以答案是你正在调用非指定的行为所以结果取决于实现! -
@SergeBallesta 编译器是 Apple LLVM 7.0。在 XCode 中打开迂腐警告后,我看到警告为“零大小数组是扩展”