标准草案中提到的零长度数组是什么
What is the zero-length array mentioned in the draft standard?
我正在阅读标准草案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
内存管理功能:
[…]如果请求的空间为零,行为由实现定义:要么是空指针返回,或者行为就像大小是某个非零值,除了返回的指针不应用于访问对象。
相关文章:
- C++数组是如何识别的
- 使用嵌套函数数组是个好主意吗?
- 将任意对象附加到数组有什么问题
- 如何检查字节数组是protobuf序列化字节数组还是普通字节数组
- 堆指针不会被分配给数组有什么原因吗
- Getter 函数,用于在 2d 数组是类的数据成员时检索 2d 数组元素
- 数组是如何通过引用、值或指针传递C++的?
- 构建对象数组是如何工作的?我被这个例子困住了
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- C/C++ 中的常量数组和静态常量数组有什么区别
- 为什么当将 short[] 转换为字符*时,数组是反转的?
- 从一系列的evens和赔率中,新数组是持续的第一个赔率
- 数组是通过引用传递的,但是如果我只传递未存储在内存中的数组的值,会发生什么
- VB6 相当于 C++ 个字符数组是什么?
- 字符串数组[] = " " 是什么;意思是,为什么它有效?
- 传递枚举数组是什么意思
- 为什么有人告诉我数组是指针?C++中数组和指针之间的关系是什么
- c++中传递裸数组是什么意思?
- 什么时候变长数组是合法的?
- 如何编写一个函数,无论数组是什么类型都输出它