标准草案中提到的零长度数组是什么

What is the zero-length array mentioned in the draft standard?

本文关键字:数组 是什么 草案 标准      更新时间:2023-10-16

我正在阅读标准草案N3337和脚注79(第110页§5.3.7)指出(emphasis mine):

79)对于非零长度数组,这与指向该新表达式创建的数组的第一个元素零长度阵列没有第一个元素

我的印象是C++不支持零长度数组。

当像这样的零长度数组时

int arr[0];

不是标准的C++,像一样长度为零的动态数组

int *arr = new int[0];

是合法的,也是你的报价所指的:

当noptr新声明符中表达式的值为零时,将调用分配函数分配一个没有元素的数组。

5.3.4(7)在N3337中。

据我所知,这是为了允许用malloc实现new,malloc允许零大小的请求。您不能对它们做太多操作,因为正如下面引用的那样,取消引用这样的指针是未定义的行为。

我们可以在C++标准草案脚注35中找到一个基本原理,该脚注引用自3.7.4.1[basic.stc.dynamic.allocation]:

[…]即使请求的空间大小为零,请求也可能失败。如果请求成功,则返回的值应为非空指针值(4.10)p0,不同于先前返回的值p1,除非该值p1随后被传递给运算符delete。这个取消引用作为零大小请求返回的指针的效果是未定义的35

脚注35中写道:

其目的是通过调用std::malloc()或std::calloc()来实现运算符new(),因此规则实质上是同样。C++与C的不同之处在于,它需要一个零请求来返回一个非空指针。

来自C11草案标准部分7.22.3内存管理功能:

[…]如果请求的空间为零,行为由实现定义:要么是空指针返回,或者行为就像大小是某个非零值,除了返回的指针不应用于访问对象。