プログラミングを始めたばかりで、初心者の質問があります。長さが不明なファイルを1行ずつ読み取る関数を作成したいと思います。各行の長さがわからないので、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()
の文字列に似ているので、この関数を使用して長さが不明な行をたくさん読み取るとしたら、メモリリークまたはメモリ不足が発生しますか?
まず、lineptr
をNULL
に初期化する必要があります。適切な初期化がないと、lineptr
に不確定な値が含まれるため、lineptr
は無効なメモリ位置を指し、処理の後半で 未定義の動作 を呼び出します。 (realloc()
)適切な量のメモリを割り当てます。
次に、 manページ に従って、
[...]
getline()
を呼び出す前に、_*lineptr
_には、サイズが_*n
_バイトのmalloc()
割り当てバッファへのポインタを含めることができます。バッファが行を保持するのに十分な大きさでない場合、getline()
はrealloc()
でサイズを変更し、必要に応じて_*lineptr
_と_*n
_を更新します。
したがって、同じ_*lineptr
_を渡す限り、最後に1回だけfree()
を渡せば問題ありません。