char *s;
(ほとんどのシステム32/64ビットで)メモリアドレスを保持するために必要なバイト数を割り当てます。 しかし、ポインタを初期化していないので、その値(のアドレスはになります)は定義されていません。
Ergo:fscanfは、未定義のメモリアドレスに書き込もうとします。
char * s = NULLとして初期化しました。
はい、ポインタは現在初期化されていますが、現在どこにも指していません。
Ergo:fscanfは何も書き込もうとしません。
解決策は、fscanfが使用できるメモリを割り当てることです。 fscanfはあなたのために魔法のようにメモリを割り当てません!
スタックメモリまたは動的割り当てメモリ(ヒープ)を使用できます。
スタックメモリは管理が簡単ですが、ヒープよりもはるかに小さくなっています。ここで
スタック上のメモリを使用するソリューション:私は%9s
代わりの%s
を使用する理由
// Allocates 10 bytes on the stack
// Given 1 Character = 1 Byte the
// buffer can hold up to 9 characters.
char myBuffer[10];
// Initialize s with the address of myBuffer
char *s = myBuffer;
// Call fscanf
fscanf(stream, "%9s", s);
あなたは不思議に思われるかもしれません。
理由は、バッファオーバーフローを防ぐためです:
関数fscanfは、バッファがどのように大きな認識していないので、あなたはそれを伝える必要があります。
それ以外の場合、fscanfは割り当てられたメモリを超えてデータを書き込みます。
一般的にCの文字列とメモリ管理についてお読みになることをお勧めします。
出典
2017-04-24 01:44:51
d3L
1. 'fopen'の結果をチェックしません。 2. 's'は初期化されていないポインタです - データはどこに行きますか? – John3136
'char s [16]; fscanf(ストリーム、 "%s"、&s); ' – BLUEPIXY
GCCを使用している場合、常に' gcc -Wall -Werror'でコンパイルしてください。 。 –