2012-01-26 19 views
1

私はちょうど私がsegfaultを与えるこのコードの部分を知りたいです。Cコードがsegfaultを与えるのはなぜですか?

if(argc < 2){ 
    printf("\n Please mention the file name"); 
    exit(1); 
} 
FILE* fp; 
if((fp = fopen(argv[1],"r")) == NULL){ 
    printf("\n can't open file"); 
    exit(1); 
} 
char* str; 
fgets(str,80,fp); 
printf("\n this is the output %s",str); 

strをchar str [100]として宣言すると、正常に動作します。

答えて

0

char* str;は、charへのポインタを宣言しますが、文字自体のためのスペースは予約しません。また、初期化していないので、メモリ内のランダムな場所を指しています。

次に、fgets(str, 80, fp)は、ファイルから80文字を取り出し、指し示された位置から開始して格納するように指示します。あなたのプログラムはその場所を所有していない可能性が高いため、segfaultを取得します。

char str[100];は、スタックに100文字分のスペースを配列として予約します。strをこの配列の先頭へのポインタとして使用できます。あなたのプログラムは、このメモリで何をしたいのか許可するので、fgetsを実行するとsegfaultはありません。配列が短すぎると、segfaultsであるとは限りませんが、問題が残っている可能性があります。

3

メモリを割り当てていません。 char *と宣言しているだけです。どちらのchar str[100]は仕事、またはます:

char *str = malloc(100); 

あなたの文字列のためのメモリを割り当てるようにします。それ以外の場合は、fgets()から自分のものではないメモリに読み込み、セグメンテーション違反の原因となります。

これを行う場合は、完了したらfree()に電話してください。

2

char* strは、初期化されていないポインタです。 fgetsは、このポインタが指すメモリに書き込みます。このポインタはどこでもかまいません。 str[100]で実際のストレージを宣言すると、書き込みに有効な100バイトのメモリが提供されます。

関連する問題