2013-07-01 2 views
-3

Рассмотрим этот бит кода урезанной:Bizarre на тетсру выдаёт ошибку сегментации в GetLine

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void main() 
{ 
    FILE * infile; 
    char * buffer; // = malloc(sizeof(char));         
    ssize_t line_length; 
    size_t nbytes; 
    int x1; 
    int x2; 
    //int x3;                 

    infile = fopen("file.txt", "r"); 
    getline(&buffer, &nbytes, infile); 
} 

Как показано, код работает без ошибок.

Если я раскомментировал int x3, я получаю segfault на линии getline. Я показал вам всю программу здесь - никогда не используется, и я понятия не имею, как это заявление может иметь значение.

Я подозреваю, что это проблема распределения памяти, потому что раскомментирование части = malloc удаляет segfault. Но что может вызвать это взаимодействие между и getline?

+0

* Неопределенное поведение * - это просто ... undefined; все может случиться. Прочтите документы для 'getline' и используйте их правильно. Нет смысла предполагать, что пошло не так, когда вы называете это неверными аргументами. – Praetorian

+0

Все ответы были полезны для меня. В частности, это моя первая встреча с неопределенным поведением - я раньше этого не слышал. – zkurtz

+0

+1 для публикации короткого, компилируемого примера. –

ответ

3

Проблема в том, что и buffer, и nbytes являются предметами специализации. От man getline():

В качестве альтернативы, перед вызовом GetLine(), * lineptr может содержать указатель на таНос (3) -allocated буфер * N байт. Если буфер не достаточно велик, чтобы удерживать строку, getline() изменяет его размер с помощью realloc (3), обновляя * lineptr и * n при необходимости.

getline() будет писать в случайную ячейке память (любое значение buffer справедливо), что было сказано в nbytes (неизвестная величина) в размере. Это undefined behaviour.

Чтобы исправить, инициализируйте переменные действительными значениями и проверьте результат fopen() перед использованием.

Смежные вопросы