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

时间:2015-11-17 13:59:24

标签: c++ arrays language-lawyer

我正在阅读标准草案N3337和脚注79(第110页第5.3.7节)(强调我的):

  

79)对于非零长度数组,这与指向该数组的指针相同   由new-expression创建的数组的第一个元素。的零长度   数组没有第一个元素

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

2 个答案:

答案 0 :(得分:6)

虽然零长度数组如

int arr[0];

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

int *arr = new int[0];

是合法的,也是你的引用所指的:

  

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

5.3.4(7)在N3337中。

答案 1 :(得分:4)

据我所知,这是允许以malloc方式实现new,允许零大小的请求。你不能对它们做很多事情,因为如下面引用中所述,取消引用这样的指针是未定义的行为。

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

  

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

和脚注35说:

  

意图是通过调用std :: malloc()或std :: calloc()来实现operator new(),因此规则基本上是   相同。 C ++与C的不同之处在于要求零请求返回非空指针。

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

  

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