http://man7.org/linux/man-pages/man3/getline.3.htmlgetline中的缓冲点是什么?
我不明白第二个参数size_t *n
的要点。
为什么你需要输入(例如stdin)和输出(某些字符数组)之间的缓冲区。
另外,在它们提供的示例中,size_t len = 0;
。设置大小为0的缓冲区的意义是什么?
http://man7.org/linux/man-pages/man3/getline.3.htmlgetline中的缓冲点是什么?
我不明白第二个参数size_t *n
的要点。
为什么你需要输入(例如stdin)和输出(某些字符数组)之间的缓冲区。
另外,在它们提供的示例中,size_t len = 0;
。设置大小为0的缓冲区的意义是什么?
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
设置为零的意义并且buffer
到NULL
告诉getline()
它没有被赋予缓冲区。因此,如果它读取任何东西,getline()
将因此重新分配。
所有这些实际上都是在您提到的链接中描述的。
getline()
需要知道数组是否足够大以容纳用户输入的行。它从n
参数获取数组的当前大小。如果数组不够大,则将其重新分配为所需的大小。然后它将*lineptr
和*n
更新为新的阵列和大小。更新*n
允许调用者知道该阵列在将来使用时有多大(例如,在示例中,在循环中调用getline()
)。请记住,C指针不包括它们指向的数组的大小。如果一个函数需要知道这个,它必须作为参数传递。
第二个参数是读取数据的大小,它告诉您从您提供的缓冲区中读出多少数据,或者它为您分配的缓冲区。 –
@RetiredNinja:不是真的;它是分配的缓冲区的大小。返回值是数据的长度(不包括结尾的空字节)。 –