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

时间:2017-10-06 22:19:47

标签: c buffer getline

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

我不理解第二个参数size_t *n

的要点

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

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

2 个答案:

答案 0 :(得分:1)

getline()的意思是它可以重新分配它收到的缓冲区。

给定一个来电者

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

来电者提供buffer的初始n长度getline()。如果buffer重新分配,则会更改n,使其指向内存,并更改realloc()以记录新的长度。

显然,这假设在buffer上执行NULL是有效的,即该缓冲区为malloc()calloc()返回的值,{{1 },或realloc()

n设置为零并将buffer设置为NULL的重要性告诉getline()它没有被提供缓冲区。因此getline()会重新分配,如果它读取任何内容。

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

答案 1 :(得分:0)

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

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