当我将0作为getline的第二个参数传递时会发生什么?

Luk*_*ong 4 c io getline

cplusplus.com指出,getline函数的第二个参数是

写入s的最大字符数

但是,我看过这样的代码:

size_t linecap = 0;
ssize_t linelen;
linelen = getline(&line, &linecap, fp);
Run Code Online (Sandbox Code Playgroud)

这不是从源读取0个字节吗?还是还有其他事情发生?

Sou*_*osh 6

不,这是不正确的。在手册页上,(重点是我的

如果*lineptrNULLgetline()则将分配用于存储行的缓冲区,该缓冲区应由用户程序释放。(在这种情况下,in中的值将*n被忽略。)

或者,在调用之前getline()*lineptr可以包含一个指向大小为malloc(3)分配的缓冲区*n字节的指针。如果缓冲区的大小不足以容纳该行,请getline()使用realloc(3),更新*lineptr*n根据需要调整其大小。

在这两种情况下,成功调用,*lineptr并且*n将被更新,以反映缓冲区地址,分别分配大小。

因此,第二个参数所指向的内存中存储的初始值对实际扫描没有影响。扫描值并将其填充到缓冲区后,

  • 函数返回值将告诉您扫描输入的大小(以字节为单位)。
  • 的值*n将告诉您分配给存储输入的缓冲区的大小(通常大于扫描的输入的大小)。