0

所以我正在使用一个动态分配的数组,我已经将它设置为容纳 5 个元素,因此应该是 0-4。如有必要,我创建了一个函数来保留它,但我想看看当我在 [5] 处为数组赋值时,我是否遇到了预期的程序崩溃。但是,没有错误,直到 [6]。

这是我的代码:

int* dynamic_arr;
dynamic_arr = new int[5];

for(int i = 0; i <= 100; i++){
    dynamic_arr[i] = i;
    used++;
    cout << dynamic_arr[i]<<endl;
}

这是输出:

0 //i[0]
1 //i[1]
2 //i[2]
3 //i[3]
4 //i[4]
5 //i[5]  <-- should be out of range

之后它崩溃了。

为什么我能够为数组的一部分分配一个值,因为缺少更好的术语而超出了范围?

谢谢

OpSrcFTW

编辑:感谢各位的回答,谢谢。我会在下次发布快速回复之前阅读更多内容,对不起。

4

4 回答 4

5

超出数组末尾的访问会产生未定义的行为。它不一定会产生崩溃。任何事情都有可能发生。

于 2013-02-19T23:33:54.320 回答
4

超出其边界访问数组是未定义的行为。任何事情都可能发生,它不需要是可重复的,尝试“理解”你认为可能存在的任何模式毫无意义。

于 2013-02-19T23:33:47.657 回答
4

超出数组大小的访问将产生未定义的行为。未定义的行为包括您的代码崩溃、工作正常、在一台计算机上工作而不是另一台计算机、重新启动计算机或破坏整个宇宙。

于 2013-02-19T23:35:36.173 回答
2

正如其他人已经指出的那样,您有未定义的行为,因此虽然可能发生崩溃,但代码似乎也可以工作。

在像您这样的情况下,当您访问稍微超过分配的内存末尾时似乎可以工作是相当普遍的。为自由存储管理内存的代码通常会将您的请求大小四舍五入到它认为方便的下一个大小,例如 2 的幂。因此,在您请求的内容结束后至少有一点内存可以写入而不会出现明显问题的情况并不少见。

当然,您不能指望这一点——即使使用相同的编译器使用相同的标志等也不行。例如,标准库可以根据目标机器上的可用内存量来决定如何操作,使用当有大量可用 RAM 时,更多填充以优化速度,而在可用内存较少时减少填充以减少内存使用。

因此,不,您不能依赖于任何特定点的崩溃——但这也不是您可以通过测试或认为这是您只需要担心的地方,如果您要移植代码。

于 2013-02-19T23:41:59.193 回答