2015-12-06 3 views
2


Я написал небольшую функцию для возврата строки, сделанной из ввода, предоставленного программе, и работал нормально, пока я не продал постоянный размер для распределения динамической памяти.
После того, как я протестировал несколько printf(), похоже, что программа вылетает при вызове realloc().
Я делаю что-то неправильно с realloc(), или это что-то еще?Как правильно переустановить?

char* get_line() 
{ 
    size_t ptr_pos = 0, size = 50; 
    int c; 
    char* line = malloc(size * sizeof *line); 
    char* temp; 

    while((c = getchar()) != EOF) 
    { 
     if(++ptr_pos >= size) 
     { 
      size += 50; 
      temp = realloc(line, size * sizeof *line); // The program crashes on this intruction. 

      if(temp != NULL) 
      { 
       line = temp; 
       printf("Reallocation success.\n"); 
      } 
      else 
      { 
       printf("Reallocation error.\n"); 
       free(line); 
       exit(1); 
      } 
     } 

     *line++ = c; 
     if(c == '\n') 
      break; 
    } 
    if(ptr_pos == 0) 
     return NULL; 
    *line = '\0'; 

    return line - ptr_pos; 
} 


Спасибо за вашу помощь.

+0

'malloc()' и 'realloc()' return 'void *'. Вы используете их непосредственно как 'char *'. Преобразуйте их явно. – Pawan

+3

Возможно, вам захочется заменить '* line ++ = c;' на 'line [ptr_pos - 1] = c;'. – alk

+1

@Pawan: Это * не * необходимо, а не рекомендовать в C. C не C++. – alk

ответ

4

Когда вы звоните realloc, вы должны указать ему адрес начала выделенной памяти, тот же адрес, который был первоначально возвращен malloc. То же самое относится к free.

Но вы изменяете значение line, поэтому оно больше не указывает на начало блока, когда вызывается realloc.

Это неопределенное поведение, поэтому segfault определенно возможно.

+0

Единственный правильный ответ. – alk

+0

О! Спасибо, rici, это не может быть более ясным! – aurelienC