我将对象的sizeof设为零,这是不应该的。请解释为什么编译器给出这个答案的概念?
#include<iostream>
using namespace std;
class xxx{
public: int a[]; // Why this line is not giving error.
};
int main(int argc, char *argv[])
{
xxx x1;
cout<<sizeof(x1); //Q=Why this code is not giving error.
return 0;
}
答案 0 :(得分:4)
正如其他人所说,C ++中的对象永远不会有0。
但是,由于代码首先是无效的C ++(数组不能为空),这是无关紧要的。编译器只是按照自己的意愿行事。
-pedantic
的GCC拒绝此代码。 MSVC至少警告说。我的版本clang++
带有-pedantic
ICE,但在此之前会发出警告。
答案 1 :(得分:2)
您没有使用符合标准的编译器。对象大小不能为0
,即使空class
或struct
的大小为1
。此外,必须指定数组维度。
- [...]当应用于类时,结果是该类对象中的字节数[...]最派生类的大小应为 大于零。 [...]将sizeof应用于基类子对象的结果是基类类型的大小。 [...]
醇>
编辑2:
我在MSVS中尝试了以下内容:
xxx a[100];
并且无法编译。奇怪的是它如何预先没有发现错误。
答案 2 :(得分:2)
您的班级a
中的元素xxx
称为灵活的数组成员。
灵活的阵列成员不符合C ++标准。它们是C99的一部分。但是,许多编译器供应商提供灵活的数组成员作为C ++扩展。
您的代码不是合法的C代码。它使用C ++特定的结构。您的代码很容易更改为C.将class
更改为struct
,删除public
,并将C ++ I / O的使用更改为C printf
。有了这些更改,您转换的代码仍然是非法的C99代码。灵活的数组成员只允许作为非空的结构的最后一个元素。
显然,您的供应商将灵活的数组成员概念转移到C ++,但不是结构非空的约束。
答案 3 :(得分:1)
对象的大小不能为零。即使班级为空,其大小也不会为零。