【问题标题】:What is the point of buffer in getline?getline 中的缓冲区有什么意义?
【发布时间】:2017-10-06 22:19:46
【问题描述】:

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

不明白第二个参数size_t *n的意思。

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

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

【问题讨论】:

  • 第二个参数是读取数据的大小,它告诉你从你提供的缓冲区中读取多少数据,或者它为你分配的缓冲区。
  • @RetiredNinja:不是这样;它是分配缓冲区的大小。返回值为数据的长度(不包括末尾的空字节)。

标签: c buffer getline


【解决方案1】:

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() 会在读取任何内容时重新分配。

所有这些实际上都在您引用的链接中进行了描述。

【讨论】:

  • 谢谢。最后一个问题,n 传递了什么大小的单位?如果 n = 1,是否分配了 1 个字节的内存?
  • 这是字节,就像sizeof 返回和malloc() 接受一样。
  • @C.Buffer 它在您链接到的手册页中说明:*n bytes in size
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2013-02-09
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多