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中都有描述。
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中都有描述。