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行完美。
答案 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++;
}
}