我刚开始编程并有一个初学者的问题,我想编写一个函数来逐行读取未知长度的文件。由于我不知道每行的长度,所以我使用getline()
函数:
void readDict(FILE *dict_file){
//Read dic
char *line;
size_t len = 0, read;
while((read = getline(&line, &len, dict_file))!=-1){
check(line);
}
free(line);
return;
}
由于getline()
类似于malloc()
和realloc()
一个字符串,所以如果我继续使用此函数来读取大量未知长度的行,我会得到一个内存吗?泄漏或内存不足?
答案 0 :(得分:16)
首先,您应该将lineptr
初始化为NULL
。如果没有正确的初始化,lineptr
将包含不确定的值,这会使lineptr
指向无效的内存位置,稍后在进程中,它会在尝试分配时调用undefined behavior(realloc()
})适量的记忆。
然后,根据man page,
[...]在调用
getline()
之前,*lineptr
可以包含指向malloc()
的指针 - 分配的缓冲区*n
字节大小。如果缓冲区不足以容纳该行,getline()
会使用realloc()
调整其大小,并根据需要更新*lineptr
和*n
。
所以,只要你传递相同的*lineptr
,如果你free()
最后只有一次,你应该没问题。