2012-11-29 117 views
1

我已用C寫一個簡單的程序:碰撞在填充陣列

#include <stdio.h> 

main(){ 
    int a[20], b[20]; 
    int n, i; 
    printf("Enter a number: "); 
    scanf("%d", &n); 
    for(int j=0; j<n; j++){ 
     printf("Enter a number for a[%d]: ", j); 
     scanf("%d", a[j]); 
     printf("\n"); 
    } 
} 

此代碼編譯但在運行時n大於2,並且當輸入到發生碰撞的陣列的第二號。

我不會爲什麼它不會崩潰,請解釋給我。

+2

只是爲了澄清,這是純粹和普通的C而不是C++(除了聲明'j'的地方) – 2012-11-29 12:01:07

+0

我編輯我的問題 – Ehsan

回答

5

scanf需要一個指針到存儲值的地方。即地址a[j]。所以scanf("%d", &(a[j]));scanf("%d", a+j);(請記住,a[j]相當於*(a+j))。

此外,還有其他各種問題。對於初學者,它應該是c還是c++?目前它不是真的(儘管它更接近於c)。如果有人輸入大於20會發生什麼?

如果你想知道是什麼導致崩潰,它將a[j](這只是一些未初始化的垃圾)中的值解釋爲地址,然後嘗試寫入該地址(完全無效)。它不喜歡這樣,操作系統會殺死你的程序。這被稱爲segmentation fault

+0

我是c和c + +中的newby,我們可以給用戶n並創建一個長度爲n的數組,只有我知道在c中不能。 – Ehsan

+1

如果這是'C++',並且您想要類似數組的東西,但您可以從用戶輸入中指定大小,或者隨時擴大它,請查看['std :: vector'](http:// en。 cppreference.com/w/cpp/container/vector)。 – BoBTFish

+0

非常感謝您的回答和評論。 – Ehsan