[英]What happens when I pass 0 as the second parameter of getline?
cplusplus.com声明getline函数的第二个参数是
要写入s的最大字符数
但是,我见过这样的代码:
size_t linecap = 0;
ssize_t linelen;
linelen = getline(&line, &linecap, fp);
这不会从源读取0个字节吗? 或者还有其他事情发生了吗?
不,这不对。 从手册页 ,( 强调我的 )
如果
*lineptr
为NULL
,则getline()
将分配用于存储该行的缓冲区,该缓冲区应由用户程序释放。 (在这种情况下,忽略*n
的值。)或者,在调用
getline()
之前,*lineptr
可以包含指向malloc(3)分配缓冲区*n
字节大小的指针。 如果缓冲区不足以容纳该行,则getline()
使用realloc(3)
调整其大小,根据需要更新*lineptr
和*n
。在任何一种情况下,在成功调用时,
*lineptr
和*n
将被更新以分别反映缓冲区地址和分配的大小。
因此,存储在第二个参数指向的内存中的初始值对实际扫描没有影响。 扫描值并填入缓冲区后,
*n
的值将告诉您分配用于存储输入的缓冲区的大小(通常大于扫描输入的大小)。 getline
的想法是尽可能少地重新分配,因为对malloc
调用往往很昂贵。 因此,如果重复使用getline
来读取文件中的行,重用相同的缓冲区和长度,缓冲区最终将增长到文件中最长行的大小,并且对于最长行之后的行不需要重新分配线。
但为了工作,必须遵循某些合同 - 即如果*lineptr
是非NULL然后它
malloc
返回的指针 *n
个字节的分配大小 推论:在这两种情况下,在*n
传递0
是正常的:
*lineptr
为NULL
*lineptr
是由返回的任何活的指针malloc
(如通过返回的任何指针malloc
将具有0字节空间)。 在这两种情况下, *n
将更新为行的长度,并且realloc(*lineptr, new_line_length_with_terminator)
的返回值(如果成功)将被分配给*lineptr
。
当然
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.