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 番目の数値を入力するとクラッシュが発生しました。

なぜクラッシュしたのか理解できません。説明してください。

4

1 に答える 1

5

scanf値を格納する場所へのポインタを取ります。すなわち のアドレスですa[j]。だからscanf("%d", &(a[j]) );、またはscanf("%d", a+j);(思い出してください、はとa[j]同等です*(a+j))。

また、これには他にもさまざまな問題があります。手始めに、それはまたはであるはずですcc++?現時点ではどちらでもありません (ただし に近いですがc)。また、誰かが より大きい値を入力するとどうなり20ますか?

クラッシュの原因が何であるか疑問に思っている場合は、a[j](初期化されていないガベージにすぎない) 値をアドレスとして解釈し、その (完全に無効な) アドレスに書き込もうとしていました。これは気に入らず、オペレーティング システムがプログラムを強制終了します。これはセグメンテーション違反と呼ばれます。

于 2012-11-29T11:58:10.853 に答える