Я получаю ошибку сегментации (ядро сброшено) при использовании getline - PullRequest
1 голос
/ 01 апреля 2019

Вот мой код:

char* ReadOneLine(char *FileName)
{
  FILE *FilePointer = fopen(FileName, "r");
  assert(FilePointer != NULL);
  char* new_line = NULL;
  size_t *line_lenght = 0;
  //ssize_t line_size;
  getline(&new_line, line_lenght, FilePointer);
  assert(new_line == NULL);
  return(new_line);
}


int main()
{
  char* buffer = ReadOneLine("example"); //Buffer will do somthing later...
  return (0);
}

Я продолжаю получать эту ошибку при попытке запустить программу, и я не могу понять, почему. Кроме того, я знаю, что я должен освободить new_line после его использования, но я не уверен, где, потому что я посылаю new_line и другим функциям.

1 Ответ

4 голосов
/ 01 апреля 2019

Указатель line_lenght никуда не указывает. Содержит нулевой указатель. Поэтому, когда getline пытается разыменовать этот нулевой указатель, вы вызываете неопределенное поведение , что в этом случае приводит к сбою.

Вместо определения line_lenght как size_t *, определите его как size_t и передайте его адрес.

size_t line_length = 0;
getline(&new_line, &line_length, FilePointer);

Что касается того, куда вызывать free, поскольку ReadOneLine возвратил ошибочный буфер, то функция, которая вызвала ReadOneLine, должна вызвать free. В этом случае, чем означает, что вам нужно вызвать free(buffer) в функции main, когда вы закончите с ней.

...