【问题标题】:C - fgets segfaultC - fgets 段错误
【发布时间】:2011-02-28 00:57:03
【问题描述】:

我有以下代码:

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;
}

而且效果很好。我 100% 确定它没有在 atoi 上出现段错误。

这是否可以被其他人重现,我在使用 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();
}

调用它的代码是:

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");
}

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

【问题讨论】:

  • 您在标准输入上提供什么输入?
  • 我已经使用以下值对其进行了测试:10、1、400、40000000 和 4adf
  • 无法重现它...也许您应该发布更多关于您提供的第一个示例附带的代码(但失败了)。
  • 这可能是某种空终止问题(虽然我现在想不出确切的原因)?

标签: c segmentation-fault fgets


【解决方案1】:

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

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

【讨论】:

  • 我会试一试。是的,它奏效了!我对此仍然很陌生,并且不太确定何时以及何时不使用指针。我可能需要阅读更多关于指针的内容。谢谢你,凯文。
猜你喜欢
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多