2

C++ 标准要求所有类型的大小至少为 1 个字节,即使结构没有成员也是如此。IE

struct x { };

sizeof(x) == 1

数组也是如此。声明零长度数组不符合标准(在 C、C++ 和 C99 中)。

int x[0];   // not allowed in C, C++ and C99 standards

那为什么呢?对我来说,这似乎是一个不必要的要求,实际上引入了不一致。

我知道一些编译器允许零长度数组作为扩展,而且 C99 允许在结构末尾使用“零”长度数组,但它更像是一个可变长度数组,并且只能在结构的末尾使用。

所以我的问题是:在语言标准中禁止使用零长度数组或要求 sizeof > 0 的原因是什么?

4

2 回答 2

2

如果某事物的大小 >= 1,则没有两个“事物”可以具有相同的地址,因此事物的地址就是它的身份。(如 Python 中的“is”,与 == 相比,两个字符串可以相等但它们可能是不同的字符串,它们可能具有不同的标识)

我还可以想象(回到 C,它是在语言变得如此正式之前就考虑到功能而创建的)它使指针算术有意义,停止奇怪的内存分配,允许比较指针以检查身份......零会是一个烦人的特例。

于 2013-10-18T04:58:43.170 回答
-1

据我了解,x[0] = 与 x 具有相同的地址。因此,sizeof(x) 总是从 1 开始,因为 x[0] 总是在声明数组 x 时被初始化。

要回答您的问题,如果我们在 C、C++ 中允许零长度数组,则实际上不会在定义点分配数组。例如在 Java 中,你声明一个数组

int [] a;

直到您调用它才分配

a = new int[10];
于 2013-10-18T04:31:07.293 回答