getline中的缓冲区有什么意义?

What is the point of buffer in getline?

http://man7.org/linux/man-pages/man3/getline.3.html

我不明白第二个参数的意义size_t *n

为什么在输入(例如标准输入)和输出(一些字符数组)之间需要一个缓冲区。

此外,在他们提供的示例中,size_t len = 0;。设置大小为0的缓冲区有什么意义?

getline() 需要知道数组是否足够大以容纳用户输入的行。它从 n 参数获取数组的当前大小。如果数组不够大,它会将其重新分配到所需的大小。然后它将 *lineptr*n 更新为新的数组和大小。更新 *n 允许调用者知道数组有多大供将来使用(例如在循环中调用 getline(),如示例中所示)。

请记住,C 指针不包括它们指向的数组的大小。如果一个函数需要知道这个,它必须作为参数传递。

getline()的要点是它可以重新分配接收到的缓冲区。

鉴于来电者在做

 size_t n = some_value();
 char *buffer = malloc(n);
 getline(&buffer, &n, stdin);

调用方提供长度为 n 的初始 buffer。如果 getline() 重新分配,它会更改 buffer 指向内存,并更改 n 以记录新的长度。

显然,这假定在 buffer 上执行 realloc() 是有效的,即缓冲区是 NULL 或者是 malloc() 返回的值,calloc()realloc().

n 设置为零以及将 buffer 设置为 NULL 的意义在于告诉 getline() 它没有被赋予任何缓冲区。 getline() 因此,如果它读取任何内容,将重新分配。

所有这些实际上在您提到的link中都有描述。