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
它。
我是 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
它。