我们都知道空类的大小或空类的对象将是1个字节.我遇到了sizeof一个类及其对象变为0的东西.该程序在语法上是正确的,因为没有编译或运行时错误.这是未定义的行为吗?我试图执行的用例有意义,看起来像一个有效的用例?不给类中的数组提供精确的下标或大小是一个很大的错误吗?代码段如下:
#include<iostream>
using namespace std;
class A
{
char a[];
};
int main()
{
A b;
cout<<sizeof(A)<<endl;
cout<<sizeof(b)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
0
在sizeof一个空类是一个字节(非零基本)和其中的原因是说,像"为了确保不同的对象有不同的地址."
在这种情况下会发生什么sizeof呢?当班级来零时?注意:也观察到相同的行为int a[].
Kir*_*rov 25
它被称为"灵活的阵列成员",它是C99的一个特征(我认为).它不是有效的C++ - 你没有警告/错误,可能是因为编译器支持它作为扩展.
使用-Wall -Wextra -pedantic -std=c++NN(98,03,11,14,..)进行编译应生成警告(最后两个标志将禁用任何编译器扩展).
您可以在此相关问题中看到一些信息:在C练习中使用灵活的数组成员吗?
例如,以下是GCC对此的说法:
在ISO C99中,您将使用灵活的数组成员,其语法和语义略有不同:
...
灵活的数组成员具有不完整的类型,因此可能不应用sizeof运算符.作为零长度数组的原始实现的怪癖,sizeof的计算结果为零.
(来源:https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html).
这解释了类的0大小char a[]而不是0,但正如我已经提到的 - 它是一个C特性,而不是一个有效的C++.