为什么不会导致分段错误

Why not causing a segmentation error?

本文关键字:分段 错误 为什么不      更新时间:2023-10-16
#include <iostream>
using namespace std;
int main(){
    int a[3], no;
    cout  << "Index Valuen";
    for(int i = 0; i < 100; i++){
        cin >> no;
        a[i] = no;
        cout << i << "t" << a[i] << endl;
    }
    return 0;
}

在这里我初始化了 a[ 3 ]。 在 for 循环中,我将输入输入 100 次输入到 a[ ],超过了 [ 3 ] 的索引。
为什么在 i 等于 4 之后它不立即给出分割错误。
输入

1 2 3 4 5 6 7输出
Index Value 0 1 1 2 2 3 4 0 5 5 6 6 7 7
当索引等于 4 时输出错误。打印 0 .预期 4

不幸的是,对于调试程序员来说,当你写到数组的末尾时,C 和 C++ 程序通常不会出现段错误。相反,如果操作系统允许的话,它通常会默默地写下指针算术上的任何内容。这通常会覆盖其他变量甚至程序代码,从而导致混乱和不可预测的错误。

我在这里使用了"通常"这个词,因为根据标准,这是"未定义的行为"——也就是说,编译器和运行时可以做任何他们喜欢的事情。

在开发和测试时,使用诸如 electricfence 之类的库非常有用,它会对内存操作进行额外的检查,并使您的程序以预期的方式失败。