2017-10-08 56 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的一個實例會與另一個實例做同樣的事情。