C:使用 fgets 读取用户输入时出现分段错误

C: Segmentation fault while reading user input with fgets

我是 C 的新手,我正在尝试编写一个包含大量用户输入的程序。为此,我编写了这个函数:

char * addValue(char * msg){
    char * input[80];
    printf("%s", msg);
    fflush(stdout);
    fgets(*input, 80, stdin);
    strtok(*input, "\n");
    return *input;
}

此功能在整个程序中完美运行,除了以下部分:

struct User{
    char userid[10];
    char email[80];
    char name[80];
    char password[80];
    char downloaded[10];
    char registred[10];
};

int change() {
    char * query = "SELECT * FROM Users WHERE user_id=";
    char * userid = addValue("Enter the User ID: "); // Works here
    // Here is a MySQL query
    char * email = addValue("Mail: "); // -> Segmentation Fault
    printf("%s\n", email);
    struct User usrvalues;
    strcpy(usrvalues.email, email);
    return 0;
}

我完全不知道为什么第二个函数调用不起作用。我在程序中有其他函数,我多次调用 addValue() 函数没有任何错误。

当我用 gdb 调试它时,我得到了这个结果:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6445b77 in __GI__IO_getline_info () from /usr/lib/libc.so.6

bt 给我以下信息:

#0  0x00007ffff6445b77 in __GI__IO_getline_info () from /usr/lib/libc.so.6
#1  0x00007ffff6444a3d in fgets () from /usr/lib/libc.so.6
#2  0x000000000040142b in addValue ()
#3  0x00000000004016e9 in change ()
#4  0x0000000000401bd0 in main ()

我尝试了不同的输入(“”(空字符串)、不同的数字(如 100)和不同的字符串(如 "test"),但每次都以分段错误结束。

我做错了什么?

input 是一个 未初始化的 指针数组。通过执行 *input 你得到第一个 未初始化的 指针并将它传递给 fgets.

我确定您不是要创建一个指向 char 的指针数组,而是一个 char:

的数组
char input[80];

然而,你有一个比这更严重的问题,因为你然后 return 一个指向这个本地数组的指针 input (好吧,在上面描述的更改之后你会),这导致到 未定义的行为 因为局部变量是局部的,它们在函数 returns 时消失并且会给你留下一个杂散的指针。

你有两个解决这个问题的方法:第一个是在调用函数中声明数组,并将它(及其大小)传递给函数,就像你将 input 及其长度传递给fgets现在。

第二种解决方案是使用 malloc 动态创建数组,然后记得在完成后 free 它。