我有一个代码,无法弄清楚为什么它崩溃(分段错误),我从过去的帖子中知道它与无法访问的内存有关(我认为),但是我初始化了“ input”变量。
#include <stdio.h>
#include <stdlib.h>
char *getInfo() {
char input[1000];
scanf("%s", input);
return input;
}
int main() {
char *x;
x = getInfo();
printf("%s\n", x);
return 0;
}
[当我运行并回溯gdb中的程序时,它说(除其他外)“ ...在main()中出现error.c:11”当我在给定输入(“树皮”)后在第11行中断时,尝试打印变量,打印输入给我'\ 000 x29',而打印x给我0x0。我知道0x0表示它为null,并且我认为\ 000也表示null,但是我不明白为什么。当我搜寻输入时,是否不应该替换null?
您的函数getInfo
返回本地变量input
的地址。但是当函数返回时,此变量将被删除,因此指针变得无效。解决此问题的常规方法是将数组作为参数传递给函数。
char *getInfo(char *input) {
scanf("%s", input);
return input;
}
并且在呼叫方:
char input[1000];
char *x = getInfo(input);
当然,在您的情况下,我只是将呼叫移至scanf
到main
:
char input[1000];
scanf("%s", input);
printf("%s\n", input);
请注意,您对scanf
的调用并不安全,因为scanf
可能读取的输入超出了缓冲区的容量。同样,我对getInfo
所做的非常简单的更改也有一个缺点,即您没有传递长度。通常,您应该将指针传递给缓冲区以及缓冲区的大小。这样,您可以确保该函数不会使缓冲区溢出。
为了获得更安全的变体,您还可以考虑以下其中一项:
scanf("%999s", input);
fgets(input, 1000, stdin);