cplusplus.com指出,getline函数的第二个参数是
写入s的最大字符数
但是,我看过这样的代码:
size_t linecap = 0;
ssize_t linelen;
linelen = getline(&line, &linecap, fp);
Run Code Online (Sandbox Code Playgroud)
这不是从源读取0个字节吗?还是还有其他事情发生?
不,这是不正确的。在手册页上,(重点是我的)
如果
*lineptr
为NULL
,getline()
则将分配用于存储行的缓冲区,该缓冲区应由用户程序释放。(在这种情况下,in中的值将*n
被忽略。)或者,在调用之前
getline()
,*lineptr
可以包含一个指向大小为malloc(3)分配的缓冲区*n
字节的指针。如果缓冲区的大小不足以容纳该行,请getline()
使用realloc(3)
,更新*lineptr
和*n
根据需要调整其大小。在这两种情况下,成功调用,
*lineptr
并且*n
将被更新,以反映缓冲区地址,分别分配大小。
因此,第二个参数所指向的内存中存储的初始值对实际扫描没有影响。扫描值并将其填充到缓冲区后,
*n
将告诉您分配给存储输入的缓冲区的大小(通常大于扫描的输入的大小)。