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

C:使用fgets读取用户输入时出现分段错误,c,input,fgets,C,Input,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{

我是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
可以获得第一个未初始化的指针,并将其传递给
fgets

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

char input[80];

但是,您还有一个更严重的问题,因为您随后返回指向此本地数组
输入的指针(好吧,在上面描述的更改之后,您会这样做),这会导致未定义的行为,因为本地变量是本地的,当函数返回时,它们将消失,并留下一个错误的指针

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

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

input
是一个未初始化的指针数组。通过执行
*input
可以获得第一个未初始化的指针,并将其传递给
fgets

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

char input[80];

但是,您还有一个更严重的问题,因为您随后返回指向此本地数组
输入的指针(好吧,在上面描述的更改之后,您会这样做),这会导致未定义的行为,因为本地变量是本地的,当函数返回时,它们将消失,并留下一个错误的指针

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

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

input
是一个未初始化的指针数组。通过执行
*input
可以获得第一个未初始化的指针,并将其传递给
fgets

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

char input[80];

但是,您还有一个更严重的问题,因为您随后返回指向此本地数组
输入的指针(好吧,在上面描述的更改之后,您会这样做),这会导致未定义的行为,因为本地变量是本地的,当函数返回时,它们将消失,并留下一个错误的指针

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

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

input
是一个未初始化的指针数组。通过执行
*input
可以获得第一个未初始化的指针,并将其传递给
fgets

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

char input[80];

但是,您还有一个更严重的问题,因为您随后返回指向此本地数组
输入的指针(好吧,在上面描述的更改之后,您会这样做),这会导致未定义的行为,因为本地变量是本地的,当函数返回时,它们将消失,并留下一个错误的指针

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


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

你有
char*input[80]
是一个包含80个未初始化指针的数组。您可能需要
字符输入[80],但我不认为行限制应该这么短(您只能读取78个字符的行,加上一个换行符,再加上一个空)。我倾向于使用像4096这样的数字,部分是因为冲击值。你可以理智地使用256。然后需要修复对
fgets()
strtok()的调用。您还必须决定如何将数据返回到调用函数;您不能简单地返回指向本地数组的指针(函数返回后它不存在)
是一个包含80个未初始化指针的数组。您可能需要
字符输入[80],但我不认为行限制应该这么短(您只能读取78个字符的行,加上一个换行符,再加上一个空)。我倾向于使用像4096这样的数字,部分是因为冲击值。你可以理智地使用256。然后需要修复对
fgets()
strtok()的调用。您还必须决定如何将数据返回到调用函数;哟