C - fgets段错误

6

I have the following code:

int get_int(void) {
    char input[10];
    fgets(input, 10, stdin); // Segfault here
    return atoi(input);
}

在标记处,程序出现了段错误。我完全不知道问题出在哪里,因为我在另一个程序中使用了以下代码:

int main(void) {
    char card[17];
    printf("Number: ");
    fgets(card, 17, stdin);
    printf("%s\n", card_type(card));
    return 0;
}

它能正常工作。我十分确定它不会在 atoi 上出现段错误。

其他人是否能复现这个问题?我使用的是 Linux amd64 平台和 GCC 4.4.5 编译的,没有警告信息。

由于有人要求,这里是调用 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();
}

调用该代码的是:
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");
}

因此,您已经到达了调用堆栈的顶部。


你在标准输入上提供了什么输入? - Kevin
我已经使用以下数值进行了测试:10、1、400、40000000和4adf。 - Corey Richardson
3
无法重现它...也许你应该发布更多的代码,包括第一个失败样本所附带的内容。 - Matthieu
这可能是一些空指针终止问题(尽管我目前无法想到确切的原因)吗? - user541686
1个回答

8

您输入数组(以及可能的高度)的声明应为int inputs[4]; 您需要一个整数数组,而不是一个指向整数的指针数组。然后,您只需使用inputsheights作为参数调用函数。

您现在正在创建一个由4个指向整数的指针组成的数组。然后使用*inputs调用函数将仅传递该数组中的第一个指针到函数get_intget_int函数将尝试将第一个指针用作数组,这不是您想要的行为。


我会试一下。是的,它起作用了!我还是很新手,不太确定何时使用指针,何时不使用指针。我可能需要更多地阅读关于指针的内容。谢谢你,Kevin。 - Corey Richardson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接