C - fgets 段错误

标签 c segmentation-fault fgets

我有以下代码:

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 上出现段错误。

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

这样您就到达了调用堆栈的顶部。

最佳答案

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

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

关于C - fgets 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5137242/

相关文章:

c# - 基于列比较的排序矩阵

C++ Qt : catching a segfault from dll

c - 如何在姓名前添加验证 mr 或 mrs

c - C 中的 Null 终止字符数组以及使用 read 和 fgets 的区别

c - 不将空格识别为循环中的字符?

c - USART接收中断stm32

逗号分隔值

c - 查找单词密度最高的文本

c++ - 取决于字符串长度的段错误?

C 代码 - 段错误 : 11