我花了一段时间才发现这个错误,并想知道为什么第二段代码不起作用。
工作:
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");
最佳答案
您将获得对堆栈上分配的单个char
的引用。该指针不能用作对字符数组的引用。
尝试将字符串替换为用作缓冲区的实际字符数组:
char readFileName[128];
scanf("%127s", readFileName);
否则将发生的情况是,不检查任何内容的
scanf
将用从stdio
获取的字符覆盖堆栈上的数据,从而导致stack buffer overflow,这意味着未定义的行为。您可以在格式说明符中指定最多提取多少个字符,但请记住要减去一个字符,因为
null
terminator是由scanf
本身自动附加的。