我正在尝试解决this problem
当我创建一个char *
并将其传递给scanf时:
char* input = "";
scanf("%s", input);
其行为为weirdly。但是,当我更改定义并将1000个字符初始化为\0
时:
char input[1000] = { '\0' };
其行为正常。为什么会这样?
我猜您正在看到细分错误。声明char* input = "";
时,将导致input
是指向字符串文字的指针。字符串文字存储在内存的只读部分中。因此,尝试用scanf
覆盖数据是对内存的无效使用。
但是,当您声明char input[1000];
时,您现在在堆栈上有了一个数组,这是可以写入的内存部分。这就是该代码起作用的原因。
第一个问题是什么呢?
char* input = "";
这是一个字节。如果您还需要编写其他内容,则为undefined behaviour,或更通俗地说是weird behaviour。
正确重新编写它后,您将获得一个1000个字符的缓冲区,并且can可以读取它而没有未定义的行为,只要输入的内容为<1000个字符。