2014-02-09 3 views
0

По какой-то причине этот код является неполадки по причине, которую я не могу найти.Почему этот код segfault? (Арифметика указателя)

char *read_line(FILE *fp) 
{ 
    char *out; 
    int counter = 0; 
    char c = getc(fp); 

    while (c != '\n' && c != EOF) 
    { 
     *(out + counter) = c; 
     counter++; 
     c = getc(fp); 
    } 

    if (c == EOF || feof(fp)) 
    { 
     return NULL; 
    } 

    *(out + counter) = '\0'; 
    return out; 
} 

Я уже попытался запустить его в gdb, и сказал мне, что это в выдаёт ошибку сегментации *(out + counter) = c;. Я не могу понять, что я делаю неправильно, может ли кто-нибудь еще?

+5

похоже char * out не инициализирован? –

+0

Что бы инициализировать его? O.o – AppleDash

+0

Если вы хотите прочитать данные где-то, вам необходимо предоставить память для этого. Поскольку код в настоящее время стоит 'out', это просто apointer в никуда. И писать туда, где он указывает, провоцирует неопределенное поведение и крушение. – alk

ответ

6

Вы не назначаете никакого значения out, поэтому, вероятно, это указывает на некорректный адрес памяти.

То, что вы, вероятно, хотите сделать, это найти длину данных, а затем выделить требуемый объем памяти, а затем прочитать фактические данные в выделенной памяти:

char *out; 
int counter = 0; 
char c = getc(fp); 
while (c != '\n' && c != EOF) { 
    counter++; 
    c = getc(fp); 
} 

out = malloc(counter+1); 
fseek(fp,0,SEEK_SET); 

counter = 0; 
c = getc(fp); 
while (c != '\n' && c != EOF) { 
    *(out + counter) = c; 
    counter++; 
    c = getc(fp); 
} 
*(out + counter) = 0; 

И не забудьте до free(out), когда вы закончите использовать его ...

BTW, а не второй цикл for, вы можете просто использовать fgets(out,count,fp).

+0

Но какое значение мне поручить? – AppleDash

+2

Адрес выделенной части памяти; см. обновленный ответ ... –

+1

@AppleDash: 42? -) – alk

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