在C ++语言中禁止零长度数组或sizeof == 0的理由是什么?

时间:2013-10-18 04:21:49

标签: c++ c arrays

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

struct x { };

sizeof(x) == 1

与数组相同。它不符合声明零长度数组(在C,C ++和C99中)。

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

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

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

所以我的问题是:fobidding零长度数组或需要sizeof>背后的理由是什么? 0语言标准?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-1)

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

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

int [] a;

在您致电

之前不会分配
a = new int[10];