C++ 元素索引超出动态分配数组的范围是否有效

C++ 元素索引超出动态分配数组的范围是否有效,c++,arrays,range,new-operator,garbage,C++,Arrays,Range,New Operator,Garbage,我已将数组声明为 int* arr = new int[10]; 然后我填了前10个元素,也填了 arr[10] = 100; arr[11] = 200; 当我这样做的时候 cout << arr[10] << '\t' << arr[11]; 我想知道为什么代码会起作用。这是有效的还是我遗漏了一些关于这个主题的信息。 arr[10]和arr[11]不应该保存任何垃圾值。读取/写入数组的越界行为是未定义的行为,因此任何情况都可能发生。它可能会工作,也可

我已将数组声明为

int* arr = new int[10];
然后我填了前10个元素,也填了

arr[10] = 100;
arr[11] = 200;
当我这样做的时候

cout << arr[10] << '\t' << arr[11];
我想知道为什么代码会起作用。这是有效的还是我遗漏了一些关于这个主题的信息。
arr[10]和arr[11]不应该保存任何垃圾值。

读取/写入数组的越界行为是未定义的行为,因此任何情况都可能发生。它可能会工作,也可能不会工作,它可能会在满月的每一秒都工作,任何事情都会发生。

您缺少未定义行为的概念。代码之所以“工作”是因为运气不好。如果你真的很幸运,它会崩溃,这将确认它无效。你的意思是“为什么代码在工作?”比如“为什么你在特定的机器上使用特定的编译器选项并运行它时会得到这个结果?”或者是“它真的工作吗?”,首先你需要研究程序集,对于后者,答案是“不,这是无效代码”,未定义并不意味着“将崩溃”。这意味着C++标准留给编译器定义或不定义在这些情况下发生的事情。通过在标准中允许未定义的行为,它允许实现进行否则无法进行的优化。如果将访问数组的越界定义为抛出越界错误,那么数组访问将非常昂贵。通过不定义它,编译器可以自由地忽略边界检查。顺便说一句,如果你撞车,你是幸运的,而不是相反。“我更喜欢大声的错误,而不是无声的错误。@PaulMcKenzie非常不走运,这可能是一个通过调试的测试,并破坏了生产。我每次都在用不同的机器工作。”。如果我要避免它,即使是我所指的那本书也在做同样的事情same@SudipGhimire你绝对应该避免。未定义行为之所以如此糟糕,是因为它可能以一种看似可预测或“正确”的方式工作。但你不能相信这一点。它可能会像你预期的那样工作20年,然后停止工作。它可能在一百万次尝试中只崩溃一次。这将给你一个真正的头痛时,试图调试它。您的书是否建议您在生产代码中这样做?因为如果是这样,我建议你再找一本书。
100   200