【问题标题】:What is the rationale to disallow zero length arrays or sizeof == 0 in the C++ language?在 C++ 语言中不允许零长度数组或 sizeof == 0 的理由是什么?
【发布时间】:2013-10-26 19:38:23
【问题描述】:

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

struct x { };

但是

sizeof(x) == 1

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

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

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

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

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

【问题讨论】:

  • 我怀疑是因为它会破坏sizeof(T[N]) == sizeof(T) * N的身份。
  • 加倍如此,因为new T[0] 是允许的,这是不同的,因为分配的数组没有附加编译时大小信息(你只得到一个指向第一个元素的指针)。跨度>
  • 为什么 sizeof(T[N]) == sizeof(T)*N ?我不确定我是否理解。假设 int x[0];然后我们有 sizeof(x) == 0 和 sizeof(x[0]) == sizeof(int)。那会有什么问题呢?
  • @AndreasH.:当他说sizeof(T[N]) 时,我认为他的意思是T 是一种类型。 sizeof(x[0])是数组x的组件类型的大小,与sizeof(x[1])相同; sizeof(int[0]) 是一个错误。但假设它不是一个错误:它会是什么?它不能为 0,因为不允许 0 长度的对象,但如果它不是 0,那么它就不是 0*sizeof(int),打破了 sizeof(int[N]) 总是 N*sizeof(诠释)。至少,这是我对 G. 观点的解释。
  • Why is the size of an empty class in C++ not zero? 的可能副本。该标准要求 &T[1] - &T[0] == 1 如果 T 的大小为零,则很难实现。

标签: c++ c arrays


【解决方案1】:

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

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

int [] a;

直到你调用它才被分配

a = new int[10];

【讨论】:

  • 如果 x 是一个大小为 n 的数组,&x[n] 是一个有效的地址,尽管它不能被取消引用。不过,可以使用它进行比较,也可以递增 p=&x[n-1]。否则,标准循环将是不可能的。所以 &x[0] 有效这一事实并不意味着 x 有一个元素。
  • @lightbringer:我不明白你的意思。是的 x[0] 与 x 具有相同的地址。也适用于零长度数组。但是在零长度数组的情况下,它是越界访问,但在 c 中总是可能的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多