2016-12-17 143 views
2
#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char* buffer = malloc(100 * sizeof(char)); 
    size_t n = 3; 

    getline(&buffer, &n, stdin); 
    printf("%s\n", buffer); 
    free(buffer); 
} 

我以为getline,0 size_t *n中的第二个参数是限制读取的字符数。但是当我用更大的输入尝试时,它仍然读取所有的输入。我在手册页和在线搜索,但无法找到答案。有谁能为我解释吗?getline中第二个参数的用途是什么?

+0

仔细阅读文档主要有助于。 – alk

回答

4

getline man pages

ssize_t getline(char **lineptr, size_t *n, FILE *stream);鉴于

如果* lineptr为NULL,则函数getline()将分配一个缓冲器,用于存储 线,这应当由用户程序被释放。 (在这种情况下,在 * n中的值将被忽略。)

可替换地,在调用函数getline(前),* lineptr可以包含 指针的malloc(3)在尺寸-allocated缓冲器* n个字节。 如果 缓冲区不足以容纳该行,getline()将使用 realloc(3)调整其大小,并根据需要更新* lineptr和* n。

强调我的。总之,n已更新,以确保线路适合。

+0

我读过这个,但是我无法理解'* n'的用途。如果函数知道字符串有多长,为什么我们需要传递它?在调用函数之前,我们初始化的值如何影响程序? –

+0

@ W.Zhu:假设你知道这条线的大小决不会大于'256'。在这种情况下,你可以避免额外的'realloc()'调用。如果这行比'256'大,那么'readline()'不会爆炸(或奇怪地返回NULL或'0'),而是默默调整大小。所以这个好处是双重的。 –

相关问题