分段错误,同时特别读取13行

时间:2011-10-03 11:43:42

标签: segmentation-fault fgets

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 :(得分:0)

size_t memRes = 0;
char **lines = malloc(memRes);

线条可能有点太小。

答案 1 :(得分:0)

在printLines函数中,“while(lines [lineI]!= NULL)”

发生的事情是line [lineI]不是NULL,它最后没有被分配。因为lineI大于nLines,所以它是段错误的。您必须将nLines传递给函数并使用它来检查边界。 “while(lineI< nLines)”

答案 2 :(得分:0)

你假设超过行尾的内存将包含一个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++;
  }
}