这是一个C++的唯一问题。在C中,编译器禁止使用空的struct
。
在C++中,sizeof(foo) == 1
的原因最终使得C++标准的“无对象应该在内存中具有与任何其他变量相同的地址”的规则可以被强制执行。您可以阅读详细信息here。
编辑:关于user2864740
约baz
出现,这也应该是非零的评论是正确的。编译器允许使用空数组,这使得看起来finessing规则没有被一致地应用到baz
,就像它是到foo
一样。事实上,这确实弄乱了指针算术。看到这个例子:
// C++14 code
#include <iostream>
using namespace std;
int main() {
struct baz {
int dummy[1];
};
cout << sizeof(baz) << endl;
baz* arr;
arr = new baz[5];
cout << &arr[0] << endl;
cout << &arr[1] << endl;
return 0;
}
// everything looks good
4
0x892c008
0x892c00c
但是,如果我们采取相同的代码和改变内部baz
数组是int dummy[0];
,那么我们得到如下的输出:
0
0x8fe3008
0x8fe3008
危险确实;这可能会导致无限循环。建议你不要这样顽皮,即使你已经找到了逃避它的方法:)
C++甚至不允许零大小的数组。 C只有在大小不是一个常量表达式时才会执行。您应该在第二个和第三个案例中阅读编译器的文档以了解它的行为,因为它们是由编译器扩展而不是标准所涵盖的。 – chris
相关:http://stackoverflow.com/questions/6180012/array-with-size-0 – juanchopanza
**哪种语言?** C和C++是巨大的不同。特别是在这方面。你不能指望一个明智的答案“C/C++”。您可以询问C ** xor ** C++。 –