

下記のプログラムをコンパイルし、実行してみたところ下の方にある数字を入力すると、Segmentation fault(コアダンプ)が表示されます。  
どこか間違っているでしょうか？  
よろしければ教えてください。

[code]

    #include <stdio.h>
    
    #define N 10
    #define NUM_SCORE 50
    
    int main ( void ) 
    {
    
        int i,j,n,x;
        int score[ NUM_SCORE ] = {
            1,  4,  9,  9,  8, 10, 10,  9,  5, 10, 
            2,  9,  6,  4,  0,  7,  3,  5,  6,  6, 
            7,  4,  2,  9,  2,  5,  5,  3,  1,  9, 
            5,  7,  3,  2,  7,  9,  1,  7,  6,  6, 
            5,  8,  2,  5,  3, 10,  6,  2,  2,  5, 
        };
    
        int histogram[ N+1 ]; 
    
        for( i = 0; i <= N; i++ )
        {   
            histogram[ i ] = 0;
        }
        
        for( j = 0; j < NUM_SCORE; j++ )
        {
            histogram[ score[ j ] ]++;
        }
    
    
        printf("点数の分布は以下の通りです．\n");
        for ( i = 0; i <= N; i++ ) 
        {
            printf(" %2d点: %d\n ", i, histogram[i] );
        }
        
        printf( "整数を入力してください>>>" );
        scanf( "%d", x );
        n = 0;
        for ( i = x; i <= N+1; i++ )
        {
            n = n + histogram[ i ];
        }
        printf( "%d点以上の人は%d人います", x, n );
        return 0;
    
    }
    
[/code]


CC BY-SA 4.0
2020-11-21T18:15:31.383
72128
2020-11-22T00:03:59.303
2020-11-21T22:48:18.847
26370
42820
question
c
Segmentation fault(コアダンプ)の原因が分かりません。

[code]

    for ( i = x; i <= N+1; i++ )
    {
        n = n + histogram[ i ];
    } 
    
[/code]

ここですね。  
配列外を参照してます。  
他の個所ではちゃんと注意しているようなので、  
気を付ければ気付けたバグですね。

よくみたらscanfも間違ってましたね。  
scanf("%d",&x);が正しい。


CC BY-SA 4.0
2020-11-21T22:49:39.153
72130
2020-11-21T22:56:58.940
2020-11-21T22:56:58.940
18637
18637
72128
answer


@Jogenara さんも指摘されていますが、Segmentation fault(コアダンプ)の原因は追加された`scanf( "%d", x
);`で、入力された値を格納する変数へのポインタを指定すべきところを、変数そのもの(しかも初期化されていない)が指定されているためです。

入力された数値文字列をintに変換した結果が、初期化されていない変数の値をポインタと見立てて、その示す先の領域に格納しようとするため、Segmentation
fault(コアダンプ)が発生しているのでしょう。  
まあ(たいがいは0で)初期化されていたとしても、それはポインタ(アドレス)としては無効な値なのでSegmentation
fault(コアダンプ)は発生しますが。

前の回答で@metropolisさんが紹介されていた[cppcheck](http://cppcheck.sourceforge.net/)だと「警告」ですが以下が表示されます。  
(WindowsのGUI画面でチェックしているので細かい表示内容は違っているかもしれませんが)

[code]

    CWE: 686
    %d in format string (no. 1) requires 'int *' but the argument type is 'signed int'.
    
[/code]

@Jogenara さん指摘のように`x`の前に`&`を付けて`scanf( "%d", &x );`としてください。

* * *

また前の回答へのコメントで`printfとscanfを追加しただけ`と書かれていましたが、それ以外のところ(ループの継続条件)も変更されていてそれも問題となります。  
元：

[code]

    for ( i = 7; i <= N; i++ )
    
[/code]

新：

[code]

    for ( i = x; i <= N+1; i++ )
    
[/code]

`i <= N`が`i <= N+1`になっています。  
それが原因でループ内の以下で問題(Segmentation fault(コアダンプ)か、そうでなくても結果の合計人数の違い)が発生するでしょう。

[code]

        n = n + histogram[ i ];
    
[/code]

上記同様cppcheckでは上記`n = n + histogram[ i ];`の行で以下の「エラー」が表示されます。

[code]

    CWE: 788
    Array 'histogram[11]' accessed at index 11, which is out of bounds.
    
[/code]

こちらは元の`i <= N`に戻してください。


CC BY-SA 4.0
2020-11-21T23:54:20.953
72132
2020-11-22T00:03:59.303
2020-11-22T00:03:59.303
26370
26370
72128
answer