为什么`fgets()`需要一个* str但是`getline()`需要一个** str参数?

时间:2012-11-20 01:20:14

标签: c arrays string pointers io

他们两个都可以从流中获得一条线。

定义如下:

 ssize_t
 getline(char ** restrict linep, size_t * restrict linecapp, FILE * restrict stream);

 char *
 fgets(char * restrict str, int size, FILE * restrict stream);

为什么getline需要a pointer to a pointer to char,而不是像a pointer to char那样使用fgets

以下两个表达式是否相同?

(1)

char *str = NULL
read = getline (&str, &len, fp);

(2)

char *str = NULL
read = fgets (str, &len, fp);

2 个答案:

答案 0 :(得分:2)

如果你传入一个指向NULL的指针,

getline()可以分配自己的内存(你必须在以后free)。 fgets 必须传递现有缓冲区。

getline需要额外的间接,因此它可以修改指向已分配内存的指针。

答案 1 :(得分:2)

因为getline会为你传递一个指向char* null的指针,所以fgets会为你分配一个缓冲区。

关于你的第二个问题:不。fgets例子可能会导致SEGV。 {{3}}期望缓冲区实际存在。