gpt4 book ai didi

c++ - 为什么只有在堆分配时才允许零长度数组?

转载 作者:IT老高 更新时间:2023-10-28 22:25:41 25 4
gpt4 key购买 nike

我注意到不允许创建长度为零的非堆分配数组。

// error: cannot allocate an array of constant length zero
char a[0];

我还注意到它允许创建零长度的堆分配数组。

// this is okay though
char *pa = new char[0];

我想它们都受到标准的保证(我手头没有标准的拷贝)。如果是这样,为什么它们如此不同?为什么不只允许堆栈上的零长度数组(反之亦然)?

最佳答案

这在 C++ 标准的以下部分中得到解决。

3.7.3.1/2:

[32.目的是通过调用 malloc()calloc() 使运算符 new() 可实现,因此规则基本相同。 C++ 与 C 的不同之处在于需要零请求才能返回非空指针。]

还有,

5.3.4,第 7 段

当 direct-new-declarator 中表达式的值为零时,调用分配函数来分配一个没有元素的数组。


C++ 标准不允许大小为 0 的数组:

8.3.4/1:

“如果存在_constant-expression+ (5.19),它应该是一个整数常量表达式,并且它的值应该大于零。”

据我了解,这背后的基本原理似乎是 C++ 标准要求每个对象都必须有一个唯一的地址(这就是即使空类对象的大小为 1 的原因)。在非堆零大小的数组,不需要创建对象,因此不需要给它地址,因此不需要首先允许它。


就 c 而言,零长度数组是 allowed by the c standard ,通常它们用于通过将零长度数组放在结构的末尾来实现具有可变大小的结构。如果我没记错的话,它通常被称为 C struct Hack

关于c++ - 为什么只有在堆分配时才允许零长度数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6861776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com