Ошибка сегментации при чтении конкретно 13 строк - PullRequest
0 голосов
/ 03 октября 2011
char **getLines(FILE *pFile)
{
  int nLines = 0;
  size_t memRes = 0;
  char **lines = malloc(memRes);
  char *current = (char*) malloc(20);
  while(fgets(current, 20, pFile) != NULL)
    {
      memRes += sizeof(char*);
      lines = realloc(lines, memRes);
      lines[nLines] = malloc(20);
      strcpy(lines[nLines], current);
      nLines++;
    }
  free(current);
  return lines;
}

void printLines(char **lines)
{
  int lineI = 0;
  while(lines[lineI] != NULL)
    {
      printf("%s", lines[lineI]);
      lineI++;
    }
}

Сначала я получаю строки, затем печатаю их.Странно, что мой код дает сбой, когда он прочитал ровно 13 строк кода, а затем напечатал их.Я получаю ошибку сегментации после печати последней строки.Отлично работает с 12 строками и с 14 строками.

Ответы [ 3 ]

0 голосов
/ 03 октября 2011

В вашей функции printLines "while (lines [lineI]! = NULL)"

В результате строки [lineI] не равны NULL, они просто не были выделены в конце,Таким образом, поскольку lineI больше, чем nLines, он вызывает ошибки.Вы должны передать nLines в функцию и использовать это для проверки границ."while (lineI

0 голосов
/ 03 октября 2011

Вы предполагаете, что память после конца строк будет содержать значение NULL, которое может или не может быть - оно неинициализировано, поэтому оно может содержать что угодно. Вам повезло с некоторыми небольшими наборами данных, и они содержат нули, так что это работает. Для больших наборов данных вы сталкиваетесь с областью памяти, в которой есть что-то еще, и она терпит неудачу. Если вы хотите, чтобы строки были равны NULL после набора указателей, содержащих данные из вызовов fgets (), вам нужно выделить его достаточно большим, чтобы содержать дополнительный указатель, и установить это пространство в NULL.

char **getLines(FILE *pFile)
{
  int nLines = 0;
  /* Start lines big enough to hold at least the NULL */
  size_t memRes = sizeof(char *);
  char **lines = malloc(memRes);
  lines[0] = NULL; /* the memory returned by malloc must be initialized */
  char *current = (char*) malloc(20);
  while(fgets(current, 20, pFile) != NULL)
  {
    memRes += sizeof(char*);
    lines = realloc(lines, memRes);
    lines[nLines + 1] = NULL;  /* Prepare the NULL to terminate display loop */
    lines[nLines] = malloc(20);
    strcpy(lines[nLines], current);
    nLines++;
  }
  free(current);
  return lines;
}

void printLines(char **lines)
{
  int lineI = 0;
  while(lines[lineI] != NULL)
  {
    printf("%s", lines[lineI]);
    lineI++;
  }
}
0 голосов
/ 03 октября 2011
size_t memRes = 0;
char **lines = malloc(memRes);

Линии могут быть слишком маленькими.

...