我花了一段时间才发现这个错误,并想知道为什么第二段代码不起作用。
工作:

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本身自动附加的。

10-04 14:48