2017-08-16 3 views
0

cのファイルからコードを読み取っているときに、自分のコードがsegフォルトを持っている理由を知りません。私は以下のコードとvalgrind出力を添付しました。助けてくれてありがとう!ファイルからfgetsを使用しているときにサイズ4の読み込みが無効です

FILE *fp; 
fp = fopen("filename", "r"); 
char line[100]; 
while (fgets(line, 100, fp) != NULL) { 
==4545== Invalid read of size 4 
==4545== at 0x4E9E34B: fgets (iofgets.c:50) 
==4545== by 0x401289: main (game.c:180) 
==4545== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
==4545== 
==4545== 
==4545== Process terminating with default action of signal 11 (SIGSEGV) 
==4545== Access not within mapped region at address 0x0 
==4545== at 0x4E9E34B: fgets (iofgets.c:50) 
==4545== by 0x401289: main (game.c:180) 
+7

'fp'が' NULL'かどうかを確認しませんでした。 – mch

+0

@alinsoar:ライブラリ呼び出しで返されたポインタをチェックしないと、より良いものが見つかるはずです。 –

答えて

4

このライン

==4545== Address 0x0 is not stack'd, malloc'd or (recently) free'd 

あなたはNULLポインタ(アドレス0x0を...)逆参照しているがわかります!

表示されているコードでは、fopenが失敗し、0/NULLが返されただけです。関数呼び出しの戻り値は常にチェックしてください。

+3

[Cプログラマの十戒](http://skull.piratehaven.org/~bapper /298c/ten-commandments.html)、アイテム2と6 ;-) – DevSolar

+0

haha​​、素敵なドキュメント:) –

+1

これは正に古代(私は80年代にこれを見てきました...)、しかしほとんどのアイテムはまだ驚くほど話題です。 ;-) – DevSolar

関連する問題