当我在数组末尾写入时,为什么不会出现分段错误?

时间:2012-09-13 15:42:19

标签: c++ segmentation-fault

为什么我编译时没有出错?

#include <iostream>
using namespace std;

int main()
{
    int *a = new int[2];
    // int a[2]; // even this is not giving error
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;
    a[3] = 3;
    a[100] = 4;
    int b;

    return 0;
}

有人可以解释为什么会这样。 在此先感谢。)

3 个答案:

答案 0 :(得分:9)

因为未定义的行为==任何事情都可能发生。你不幸的是它不会崩溃,这种行为可能会隐藏错误。

至于a被定义两次 - 这是编译器中的一个错误。

答案 1 :(得分:3)

我猜你是来自Java或类似Java的语言,一旦你走出数组的边界,就会得到“数组索引超出界限”的异常。

嗯,C期待你的更多;它节省了你要求的空间,但它不会检查你是否超出了那个节省空间的边界。一旦你如上所述那样做,程序就会有可怕的未定义行为。

并且记住未来如果你的程序中有一个错误并且你似乎找不到它,当你查看代码/调试它时,一切似乎都没问题,你很有可能“越界”并进入未分配的地方。

答案 2 :(得分:0)

具有良好代码分析的编译器肯定会警告超出阵列分配的代码引用。忘记多个声明,如果你运行它,它可能会或可能不会出错(未定义的行为正如其他人所说)。例如,如果你有一个4KB的堆页(在处理器地址空间中),如果你不在该页面之外写,那么你就不会从处理器中得到错误。删除数组后,如果已经完成,并且根据堆实现,堆可能会检测到它已损坏。