为什么可以在C ++中将长度为0的数组中添加定义元素

时间:2017-05-09 07:43:13

标签: c++ dynamic

我正在阅读C ++考试并且只是为了更好地理解语言。我的理解是c ++中的数组在运行时或动态之前定义为固定长度。知道这一点我不明白为什么C ++会接受这个。我不认为可以将元素添加到长度为0的数组中;

int * TestArray = new int[0];
TestArray[0]=10;
TestArray[1]=20;
TestArray[2]=30;

3 个答案:

答案 0 :(得分:4)

写入有效大小之外的数组元素是Undefined Behavior。这是一个错误,你的程序形成不良。但是编译器不是 required 来发出诊断(尽管大多数都会使用正确的警告选项)。  您有责任遵守规则。

答案 1 :(得分:1)

您可能无法访问零大小数组中的任何元素。它导致未定义的运行时行为。 但是,由于各种原因,允许零大小的数组。

首先,它允许您通过跳过大小检查来减少函数的复杂性:

   void f(size_t n)
   {
    int * ptr = new int[n];
    //...
    delete[] ptr;
   }

而不是:

void f(size_t n)
{
 if (n>0)
 {
  int * ptr = new int[n];
  //...
  delete[] ptr;
 }
}

其次,目的是让编译器编写者使用malloc轻松实现new,这是malloc的定义行为。

GCC c编译器文档给出了这个原因: “在GNU C中允许使用零长度数组。它们作为结构的最后一个元素非常有用,它实际上是一个可变长度对象的头部:”

struct line {
  int length;
  char contents[0];
};

struct line *thisline = (struct line *)
  malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

[没有它],你必须给内容一个长度为1,这意味着你要浪费空间或使参数复杂化到malloc。

答案 2 :(得分:0)

我的教授告诉我,因为c ++和c可以在数组边界之外访问和写入,所以它是用于创建操作系统的主要原因之一。例如,您甚至可以执行类似

的操作
arr[-1]=5;

我相信值得一提。但这可能会导致未定义的行为。