Идея getline
заключается в том, что перераспределений как можно меньше, поскольку вызовы malloc
, как правило, дороги. Следовательно, если вы будете многократно использовать getline
для чтения строк в файле, используя один и тот же буфер и длину, буфер будет в конечном итоге увеличен до размера самой длинной строки в файле, и для последующих строк не потребуется перераспределение самая длинная линия.
Но для того, чтобы это работало, должны соблюдаться определенные контракты, а именно, если *lineptr
равно не NULL , то оно
- должен быть указателем, возвращаемым
malloc
- должен иметь размер выделения не менее
*n
байтов
Следствие: прохождение 0
в *n
в порядке при следующих двух обстоятельствах:
- , если
*lineptr
равно NULL
*lineptr
- это любой живой указатель, возвращаемый malloc
(так как любой указатель, возвращаемый malloc
, будет иметь пространство в 0 байт).
в обоих случаях *n
будет обновлено до длины строки, а возвращаемое значение realloc(*lineptr, new_line_length_with_terminator)
(в случае успеха) будет присвоено *lineptr
.
Конечно