Cor*_*son 5 c fgets segmentation-fault
我有以下代码:
int get_int(void) {
char input[10];
fgets(input, 10, stdin); // Segfault here
return atoi(input);
}
Run Code Online (Sandbox Code Playgroud)
它给了我一个标记的段错误.我完全不知道问题是什么,因为我在不同的程序中有以下代码:
int main(void) {
char card[17];
printf("Number: ");
fgets(card, 17, stdin);
printf("%s\n", card_type(card));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常.我100%肯定它不是atoi上的segfaulting.
这是否可以被其他人重现,我使用GCC 4.4.5在Linux amd64上.它编译并输出没有警告.
由于它是被请求的,这里是调用get_int的代码:
void get_input(int *inputs) { // Stop cluttering up my main
printf("M spotting F: ");
inputs[0] = get_int();
printf("F spotting M: ");
inputs[1] = get_int();
printf("F spotting F: ");
inputs[2] = get_int();
printf("M spotting M: ");
inputs[3] = get_int();
}
Run Code Online (Sandbox Code Playgroud)
调用它的代码是:
int main(void) {
int *inputs[4];
int *heights[4];
get_input(*inputs);
get_heights(*inputs, *heights);
print_bars(*heights);
printf("M4F F4M F4F M4M\n");
}
Run Code Online (Sandbox Code Playgroud)
因此,您已达到调用堆栈的顶部.
小智 8
你对输入(可能是高度)数组的声明应该是int inputs[4];你想要一个整数数组,而不是一个指向整数的指针数组.然后,您想要使用just inputs和heightsas参数调用函数.
你现在正在做的是创建一个由4个整数指针组成的数组.然后调用函数*inputs将只将该数组中的第一个指针传递给函数get_int.该get_int函数将尝试将第一个指向整数的指针用作数组,这不是您想要的行为.