2011-05-06 13 views
0

私はtxtファイルをコマンドライン引数として渡して、内容をstdoutに表示します。私は5つの整数変数(n、a、b、i、temp)をプログラムの最初に作成したい。しかし、このプログラムは2つ以上の整数を宣言すると、私にsegfaultを与えています。私が3番目のint宣言(int b)をコメントアウトすると、プログラムは正常に動作しています。また、私はubuntuを実行しています。シンプルなプログラムはsegfaultを与えて、奇妙な動作を把握することができません

main(int argc, char *argv[]){ 
    int n; 
    int a; 
    int b; 
// int i; 
// int temp; 
    char *s; 
    if(argc!=2){ 
      printf("not enough arguments provided!!\n"); 
      exit(-1); 
    } 
    FILE *fp = fopen(argv[1],"r"); 
    while((s=fgets(s,5,fp))!=NULL){ 
      n = atoi(s); 
      printf("%d",n); 
} 
    fclose(fp); 
} 
+1

は、[GDB](http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html)あなたの友達です。 – nmichaels

+0

おかげでnmichaels。私は間違いなくgdbを使用する方法を学ぶ必要があります – rkt

答えて

3

fgets(s,5,fp)は、初期化されていないポインタを読み込みます。読み取ったデータを格納するストレージを割り当てる必要があります。

変更char *s;編集

char s[5];には:あなたはまた、fopen()では成功したか失敗したかどうかを確認する必要があります

while(fgets(s,5,fp)) { 

:また、あなたのwhileループ条件を変更してください。

+0

私はint bをコメントアウトする場合;プログラムは正常に実行されています。引数として渡しているtxtファイルの内容を表示しています。これは問題ではないでしょうか? – rkt

+0

char * pをchar s [5]に変更すると、別の問題が発生します。関数atoiはchar * char [5]を期待しています。 – rkt

+0

@user - コメントアウトはクラッシュとは関係ありません。初期化されていないポインタの動作は未定義です。だから、あなたがプログラムの中で何かをコメントするときに働いているようです。 'char []'は渡されると 'char *'に変換されます。渡されると、配列はポインタに減衰します。したがって、配列を使用することは問題ではありません。 – Mahesh

0

sは、初期化されていないポインタです。 fgetsへのコール中に、最初の引数はコンテンツをコピーできる場所である必要があります。 sはどこに(またはごみ)の場所を指していて、その場所にコピーしようとしているのがエラーの原因です。ただ、宣言

char s[1] ; // Instead of char *s ; or declare it as an character array to 
      // to the size you may require. 
関連する問題