2012-11-20 83 views
0

他们都可以从流中获取一行。为什么`fgets()`需要一个* str,但是`getline()`需要一个** str参数?

定义如下:

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

函数getline两个表达式()就可以了,如果在指针传递给NULL,分配自己的内存(您必须稍后free)。 fgets 必须传递一个现有的缓冲区。

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

2

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

至于你的第二个问题:不。fgets例子可能会导致一个SEGV。 fgets预计缓冲区实际存在。

相关问题