2017-10-06 161 views
-1

http://man7.org/linux/man-pages/man3/getline.3.htmlgetline中的缓冲点是什么?

我不明白第二个参数size_t *n的要点。

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

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

+0

第二个参数是读取数据的大小,它告诉您从您提供的缓冲区中读出多少数据,或者它为您分配的缓冲区。 –

+0

@RetiredNinja:不是真的;它是分配的缓冲区的大小。返回值是数据的长度(不包括结尾的空字节)。 –

回答

1

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

给定呼叫者做

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

呼叫者提供长度n的初始buffer。如果getline()重新分配,它将更改buffer,以便它指向内存,并更改n以记录新的长度。

显然,这假定它是有效的做realloc()buffer上即该缓冲液是NULL或是malloc()calloc(),或realloc()返回的值。

n设置为零的意义并且bufferNULL告诉getline()它没有被赋予缓冲区。因此,如果它读取任何东西,getline()将因此重新分配。

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

+0

谢谢。最后一个问题,单位通过n的大小是多少?如果n = 1,是否分配了1个字节的内存? –

+0

它是字节,就像'sizeof'返回和'malloc()'一样。 – Barmar

+0

@ C.Buffer它在你链接到的手册页中说:'* n字节的大小' – Barmar

0

getline()需要知道数组是否足够大以容纳用户输入的行。它从n参数获取数组的当前大小。如果数组不够大,则将其重新分配为所需的大小。然后它将*lineptr*n更新为新的阵列和大小。更新*n允许调用者知道该阵列在将来使用时有多大(例如,在示例中,在循环中调用getline())。请记住,C指针不包括它们指向的数组的大小。如果一个函数需要知道这个,它必须作为参数传递。