2012-11-20 84 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預計緩衝區實際存在。

相關問題