http://man7.org/linux/man-pages/man3/getline.3.html
我不理解第二个参数size_t *n
。
为什么在输入(例如stdin)和输出(某些字符数组)之间需要一个缓冲区。
此外,在他们提供的示例中,size_t len = 0;
。设置大小为0的缓冲区有什么意义?
答案 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指针不包含它们指向的数组的大小。如果函数需要知道这一点,则必须将其作为参数传递。