更改顺序修复了我的错误。为什么?

时间:2012-10-04 03:32:18

标签: c io

我花了一些时间来弄清楚这个错误,并想知道为什么第二个代码块不起作用。

工作:

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");

2 个答案:

答案 0 :(得分:3)

您正在获取对堆栈上分配的单个char的引用。该指针无效,无法用于对字符数组的引用。

尝试使用用作缓冲区的真实字符数组替换字符串:

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

否则将发生的事情是scanf,不检查任何内容,将使用从stdio获取的字符覆盖堆栈中的数据,从而导致stack buffer overflow,这意味着未定义行为。

您可以指定格式说明符中最多要提取的字符数,但请记住减去一个,因为scanf自动附加null terminator

答案 1 :(得分:2)

通过纯粹的运气(未定义的行为),您的程序的一个版本可以正常工作。

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

您正在将整个文件名写入仅一个字节的内存空间!大概你的意思是:

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

程序的“工作”版本仅覆盖了您不需要立即打开“保存”文件的字节。这就是为什么它似乎正常运行,即使它是错误的。

在使用scanf()之前,请确保分配足够的空间。