【问题标题】:What is the zero-length array mentioned in the draft standard?标准草案中提到的零长度数组是什么?
【发布时间】:2015-11-17 13:59:23
【问题描述】:

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

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

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

【问题讨论】:

  • 你不能用它们做很多事情。据我所知,基本上是允许用malloc实现new。

标签: c++ arrays language-lawyer


【解决方案1】:

虽然像零长度数组

int arr[0];

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

int *arr = new int[0];

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

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

N3337 中的 5.3.4 (7)。

【讨论】:

    【解决方案2】:

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

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

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

    脚注 35 说:

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

    来自C11草案标准部分7.22.3内存管理函数:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2016-01-25
      • 2018-10-26
      • 2012-09-06
      • 1970-01-01
      相关资源
      最近更新 更多