【问题标题】:Why `fgets()` need a *str but `getline()` need a **str parameter?为什么`fgets()`需要一个*str而`getline()`需要一个**str参数?
【发布时间】:2012-11-08 01:11:36
【问题描述】:

他们都可以从流中得到一行。

定义如下:

 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,而不是像fgets那样使用a pointer to char

下面两个表达式是否等价?

(1)

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

(2)

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

【问题讨论】:

    标签: c arrays string pointers io


    【解决方案1】:

    getline() 可以,如果你传入一个指向 NULL 的指针,分配它自己的内存(你以后必须free)。 fgets 必须传递一个现有的缓冲区。

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

    【讨论】:

      【解决方案2】:

      因为getline 会为你分配一个缓冲区,如果你将一个指向char* 的指针传递给null

      至于您的第二个问题:不。fgets 示例可能会导致 SEGV。 fgets 期望缓冲区实际存在。

      【讨论】: