0

このエラーを理解するのにしばらく時間がかかり、なぜコードの2番目のブロックが機能しないのか疑問に思いました。

働く:

FILE *readFile;
FILE *saveFile;

char readFileName;
char saveFileName;

printf("read file name:\n");
scanf("%s", &readFileName);
readFile = fopen(&readFileName, "r");

printf("save file name:\n");
scanf("%s", &saveFileName);
saveFile = fopen(&saveFileName, "w");

動作しませんでした:

FILE *readFile;
FILE *saveFile;

char readFileName;
char saveFileName;

printf("read file name:\n");
scanf("%s", &readFileName);

printf("save file name:\n");
scanf("%s", &saveFileName);

readFile = fopen(&readFileName, "r");
saveFile = fopen(&saveFileName, "w");
4

2 に答える 2

3

charスタックに割り当てられた単一への参照を取得しています。そのポインターは、文字の配列への参照として使用するには無効です。

文字列をバッファとして使用される実際の文字配列に置き換えてみてください。

char readFileName[128];
scanf("%127s", readFileName);

そうしないとscanf、何もチェックしない がスタック上のデータを からフェッチした文字で上書きし、スタック バッファ オーバーフローがstdio発生します。これは未定義の動作を意味します。

フォーマット指定子でフェッチする最大文字数を指定できますが、nullターミネータは自動的に追加されるため、忘れずに 1 つ減算しscanfてください。

于 2012-10-04T03:37:26.500 に答える
2

プログラムの 1 つのバージョンが機能したのは、まったくの運 (未定義の動作) によるものです。

char readFileName;
...
scanf("%s", &readFileName);
readFile = fopen(&readFileName, "r");

ファイル名全体を 1 バイトのメモリ空間に書き込んでいます! おそらく、次のような意味でした:

char readFileName[1024];
...
scanf("%s", readFileName);
readFile = fopen(readFileName, "r");

プログラムの「動作」バージョンは、「保存」ファイルを開くためにすぐに必要のないバイトを上書きしただけです。そのため、間違っていても正しく機能しているように見えます。

を使用する前に、十分なスペースを確保してくださいscanf()

于 2012-10-04T03:37:56.860 に答える