2016-03-05 18 views
-6

下面的代碼具有固定大小2的陣列,這意味着它應該存儲最大3個元素a [0],A [1],A [2],但在給予進一步值編譯唐不顯示任何錯誤消息,並且值正確存儲。如何?C編程:陣列沒有任何約束

#include <stdio.h> 
int main() { 
    int a[2]; 
    a[0] = 1; 
    a[1] = 2; 
    a[2] = 3; 
    a[3] = 9; 
    a[4] = 99; 
    printf("%d\n", a[0]); 
    printf("%d\n", a[1]); 
    printf("%d\n", a[2]); 
    printf("%d\n", a[3]); 
    printf("%d\n", a[4]); 

    return 0; 
} 

輸出:-1 2 3 9 99

+0

因爲C不需要邊界檢查。你看到的是未定義的行爲。 – 2016-03-05 20:17:24

+0

另外'的INT A [2]'意味着它存儲**兩個項目**(正好兩個,而不是僅僅在最大),'一個[0]'和'一個[1]'。使用'a [2]'已經是未定義的行爲,因爲它位於數組之外。 – 2016-03-05 20:18:49

+0

見[未定義的行爲(https://en.wikipedia.org/wiki/Undefined_behavior)。在幕後,你的程序正在做非常糟糕的事情。通常情況下,但並不總是會導致錯誤的輸出或崩潰。 – user3386109

回答

0

否,大小2的陣列並不意味着存儲3個元素,它只能存儲2個元素。 C不阻止您嘗試訪問數組超出其邊界,但隨後的代碼調用未定義的行爲。

編譯器應該足夠聰明,可以檢測到您錯誤地訪問a[2]a[3]a[4]。也許你沒有給它足夠的警告級別,或者改變優化設置可以做到這一點。無論如何,你的代碼會調用未定義的行爲,所以任何事情都可能發生。

這裏是一個修正版本:

#include <stdio.h> 
int main() { 
    int a[5]; 

    a[0] = 1; 
    a[1] = 2; 
    a[2] = 3; 
    a[3] = 9; 
    a[4] = 99; 
    printf("%d\n", a[0]);  
    printf("%d\n", a[1]); 
    printf("%d\n", a[2]); 
    printf("%d\n", a[3]); 
    printf("%d\n", a[4]); 
    return 0; 
}