所以我正在使用动态分配的数组,并且我将它设置为容纳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
编辑:感谢答案,谢谢。我会在下次发布快速回答之前阅读更多内容,抱歉。答案 0 :(得分:5)
超出数组末尾的访问会产生未定义的行为。它不一定会导致崩溃。任何事情都可能发生。
答案 1 :(得分:4)
访问超出其边界的数组是未定义的行为。任何事情都可能发生,它不需要重复,并且试图“理解”你认为可能存在的任何模式都没有什么意义。
答案 2 :(得分:4)
访问超出数组大小将产生未定义的行为。 未定义的行为包括代码崩溃,工作完全正常,在一台计算机上工作而不是另一台计算机,重新启动计算机或破坏整个Universe。
答案 3 :(得分:2)
正如其他人已经指出的那样,您有未定义的行为,因此虽然可能发生崩溃,但代码似乎也可以正常工作。
在像您这样的情况下,当您在分配的内存末尾访问稍微时出现工作是相当常见的。管理免费商店内存的代码通常会将您的请求大小舍入到它认为方便的下一个大小,例如2的幂。因此,在没有可见问题的情况下,在您请求的结束时至少有一点内存并不是特别罕见。
当然,你不能指望这一点 - 即使是使用相同标志的相同编译器等也是如此。例如,标准库可以根据目标上可用的内存量决定如何操作机器,当有足够的RAM时使用更多填充来优化速度,并且当可用性较低时使用较少的填充以减少内存使用。
因此,你不能在任何特定时刻依赖崩溃 - 但这也不是你可以通过测试得到的地方,或者认为如果你要去的话你只需要担心移植代码。