2017-10-08 79 views
0

没有故障为什么以下代码不给分段故障Ç段错误使用可变索引与使用数来索引阵列

#include <stdio.h> 
int main(){ 
    int i = 0; 
    int x [10]; 
    while(i < 500){ 
     x[500] = 3; 
     printf("%d", x[500]); 
     i++; 
    } 
} 

但是这个代码。

#include <stdio.h> 
int main(){ 
    int i = 0; 
    int x [10]; 
    while(i < 500){ 
     x[i] = 3; 
     printf("%d", x[i]); 
     i++; 
    } 
} 

我决定做实验的一点点,看看系统调用strace的,想看看如何操作系统将处理分段故障。我写了第一段代码,期望出现分段错误,但没有得到一个,因为我正在写入不属于我的内存而感到困惑。所以我记得使用循环得到错误,并得到了第二段代码,这给了我一个分段错误。现在我不明白为什么使用i来索引数组,相比于使用索引超出数组范围会改变,如果我得到了分段错误。

+1

这是未定义的行为。 –

+0

在第二个示例中,您正在销毁返回地址,在第一个示例中,您正在写某个地方但没有任何负面影响。未定义的行为。 –

+0

我从来没有听说过未定义的行为,所以我查了一下,看了一下。纠正我,如果我错了,但在第一个例子中,编译器知道当我写入500时会发生什么,所以它不会通过错误。而在第二个例子中,编译器无法知道如果我在访问内存的循环中有一个变量会发生什么情况,所以会引发错误? – Shawnzye

回答

2

你会在两个例子中出界,这是未定义的行为。现在任何事情都可能发生,并且不能保证UB的一个实例会与另一个实例做同样的事情。