C - fgets segfault

У меня есть следующий код:

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

Это дает мне segfault, где отмечено. Я абсолютно не знаю, в чем проблема, потому что у меня есть следующий код в другой программе:

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

И это работает нормально. Я на 100% уверен, что это не segfaulting на 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");
}

Таким образом, вы достигли вершины стека вызовов.


person Corey Richardson    schedule 28.02.2011    source источник
comment
какой ввод вы предоставляете на стандартный ввод?   -  person Kevin    schedule 28.02.2011
comment
Я протестировал его со значениями: 10, 1, 400, 40000000 и 4adf.   -  person Corey Richardson    schedule 28.02.2011
comment
Не удалось воспроизвести это... Возможно, вам следует опубликовать больше кода того, что идет с первым приведенным вами образцом (и это не удается).   -  person Matthieu    schedule 28.02.2011
comment
Может быть, это какая-то проблема нулевого завершения (хотя я не могу точно понять, почему на данный момент)?   -  person user541686    schedule 28.02.2011


Ответы (1)


Ваши объявления для массивов ввода (и, возможно, высоты) должны быть int inputs[4]; Вам нужен массив целых чисел, а не массив указателей на целые числа. Затем вы хотите вызвать функции только с inputs и heights в качестве параметров.

Что вы делаете сейчас, так это создаете массив из 4 указателей на целые числа. И тогда вызов функции с *inputs передаст только первый указатель в этом массиве на функцию get_int. Функция get_int попытается использовать первый указатель на целое число как массив, а это не то поведение, которое вам нужно.

person Kevin    schedule 28.02.2011
comment
Я попробую. Да, это сработало! Я все еще очень новичок в этом и не совсем уверен, когда и когда не использовать указатель. Мне, вероятно, нужно больше читать об указателях. Спасибо, Кевин. - person Corey Richardson; 28.02.2011