printf或scanf上的段错误[重复]

问题描述 投票:0回答:1

我有一个代码,无法弄清楚为什么它崩溃(分段错误),我从过去的帖子中知道它与无法访问的内存有关(我认为),但是我初始化了“ 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?

c printf scanf
1个回答
1
投票

您的函数getInfo返回本地变量input的地址。但是当函数返回时,此变量将被删除,因此指针变得无效。解决此问题的常规方法是将数组作为参数传递给函数。

char *getInfo(char *input) {
   scanf("%s", input);
   return input;
}

并且在呼叫方:

char input[1000];
char *x = getInfo(input);

当然,在您的情况下,我只是将呼叫移至scanfmain

char input[1000];
scanf("%s", input);
printf("%s\n", input);

请注意,您对scanf的调用并不安全,因为scanf可能读取的输入超出了缓冲区的容量。同样,我对getInfo所做的非常简单的更改也有一个缺点,即您没有传递长度。通常,您应该将指针传递给缓冲区以及缓冲区的大小。这样,您可以确保该函数不会使缓冲区溢出。

为了获得更安全的变体,您还可以考虑以下其中一项:

scanf("%999s", input);
fgets(input, 1000, stdin);
© www.soinside.com 2019 - 2024. All rights reserved.