我正在阅读标准草案N3337和脚注79(第110页第5.3.7节)(强调我的):
79)对于非零长度数组,这与指向该数组的指针相同 由new-expression创建的数组的第一个元素。的零长度 数组没有第一个元素
我的印象是C ++不支持零长度数组。
答案 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
内存管理功能:
[...]如果大小 请求的空间为零,行为是实现定义的:空指针 返回,或者行为就好像大小是非零值,除了 返回的指针不得用于访问对象。