我是C的新手,而我正在尝试编写一个包含大量用户输入的程序。为此,我写了这个函数:
Collector<Map<String, Object>, ?, Map<String, Object>> collector =
MoreCollectors.pairing(
Collectors.summingDouble(m -> (Double)m.get("price")),
Collectors.summingInt(m -> (Integer)m.get("id")),
(sumPrice, sumId) -> EntryStream.<String, Object>of
("sum_price", sumPrice, "sum_id", sumId).toMap());
Map<String, Map<String, Object>> grouped = StreamEx.of(positions)
.groupingBy(m -> m.get("Mod") + "<|>" + m.get("bigger"), collector);
除了本部分外,此功能在整个程序中完美运行:
char * addValue(char * msg){
char * input[80];
printf("%s", msg);
fflush(stdout);
fgets(*input, 80, stdin);
strtok(*input, "\n");
return *input;
}
我完全不知道为什么第二个函数调用不起作用。我在程序中有其他函数,我多次调用addValue()函数而没有任何错误。
当我使用gdb调试时,我得到了这个结果:
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;
}
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6445b77 in __GI__IO_getline_info () from /usr/lib/libc.so.6
给了我以下信息:
bt
我尝试了不同的输入(&#34;&#34;(一个空字符串),不同的数字,如100和不同的字符串,如&#34; test&#34;),但它每次以分段错误结束
我做错了什么?
答案 0 :(得分:3)
input
是一个未初始化的指针数组。通过执行*input
,您将获得第一个未初始化的指针,并将其传递给fgets
。
我确定你并不是要创建一个指向char
的数组,而是一个char
的数组:
char input[80];
但是,你有一个比这更严重的问题,因为你然后返回一个指向这个本地数组input
的指针(好吧,在你上面描述的更改之后),这会导致未定义的行为因为局部变量是局部变量,所以当函数返回时它们会消失,并且会给你留下一个迷路指针。
你有两个解决这个问题的方法:第一个是在调用函数中声明数组,并将它(及其大小)传递给函数,就像传递input
并将其长度传递给{{ 1}}现在。
第二种解决方案是使用fgets
动态创建数组,然后在完成后再记住malloc
。