2016-08-13 12 views
0

最近、私はK & Rの本からCを学んでいて、エラーを見つけました。私が分かっていることから、セグメンテーションフォールトはメモリと関係がありますが、本書では説明されていません。私のコードを見て、セグメンテーションの欠陥が何であるか、そしてこのエラーがどのように私のコードにあるのかを説明してください。ありがとうございました。あなたがゼロにndigitを初期化していないC lang:セグメンテーションフォールト11

#include <stdio.h> 

#define MAXLINE 256 

int main() { 
    int c, ndigit[10], i, d, e; 
    char str[MAXLINE]; 
    while ((c = getchar()) != EOF) { 
     if (c >= '0' && c <= '9') 
      ++ndigit[c - '0'];} 
    for (i = 0; i <= 9; i++) { 
     for (d = 0; d < ndigit[i]; d++) 
      str[d] = '*'; 
    str[d] = '\0'; 
    printf("%d: %s\n",i,str); 
    for (e = 0; e <= MAXLINE; e++) 
     str[e] = '\0'; 
    } 
    return 0; 
} 
+2

'for(e = 0; e <= MAXLINE; e ++)'は 'for(e = 0; e

答えて

4

、それはあなたがしてインクリメントごみ値の配列です。おそらくndigitの値がかなり大きいため、非常に大きなインデックスを持つstrにアクセスし、str配列の境界を無効なメモリ領域にあふれさせる可能性があります。オペレーティングシステムは無効なメモリ領域にアクセスしようとしていて、segmentation faultを発行してプログラムを強制終了します。ジャン=フランソワ・ファーブルが指摘するようにstrのための最後の有効なインデックスがMAXLINE - 1あるので

また、あなたのfor -loopは< MAXLINEに行く必要があります。

mszymborskiが指摘するように、printステートメントの最後に改行('\n')が必要です。

+2

そして印刷時の改行もうまくいくでしょう。 – mszymborski

+0

ありがとうございます@ Cornstalks。それは私の馬鹿だった、私は今朝私のコーヒーを持っていないでしょう。プログラムは期待どおりに実行されます –

+1

'Valgrind'が本当にうまく動作するようなデバッグの問題を追加する価値があります。私はそれがメモリアクセス命令を傍受し、致命的な精度で問題を突き止めることができると信じています。 – mszymborski

関連する問題