我正在阅读C ++考试并且只是为了更好地理解语言。我的理解是c ++中的数组在运行时或动态之前定义为固定长度。知道这一点我不明白为什么C ++会接受这个。我不认为可以将元素添加到长度为0的数组中;
int * TestArray = new int[0];
TestArray[0]=10;
TestArray[1]=20;
TestArray[2]=30;
答案 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;
我相信值得一提。但这可能会导致未定义的行为。