2017-06-21 130 views
0

我在include函數和main函數之前看到這行。請詳細說明POSIX getline()函數的這個聲明

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

我可以推斷

  • 函數getline是一個函數,採用三個輸入參數。我也明白文件指針(第三個參數)

如果我堅持

  • 我不明白其他兩個輸入參數,併爲size_t函數getline。
  • size_t是這裏的類型嗎?
  • 另外兩個* s是什麼意思?我認爲一個*是指針。
+1

參見在http://man7.org/linux/man-pages/man3/getline.3功能說明。 html –

+0

你應該**總是** RTFM! – Stargateur

+1

你可能會注意到POSIX說['getline()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)返回一個'ssize_t'(一個相同大小的簽名類型作爲無符號類型'size_t')。所以,如果包含''標頭並且啓用了POSIX聲明,則由於正式原型與問題中引用的原型之間的區別,代碼將不會編譯。 –

回答

3

size_t是一種類型。它可能在包含的頭文件之一中定義。該函數返回該類型的值,其第二個參數是指向該類型值的指針。

您確定*表示指針。所以**是一個指向指針的指針。所以函數參數lineptr是內存中位置(A)的地址,它包含內存中另一個位置(B)的地址;第二個位置的數據應解釋爲char值。這意味着函數可以將存儲在位置A的值改變爲指向除B以外的某個位置。

2

指針變量需要內存來存儲內存地址的值。如果你要定義一個指針變量來存儲一個int型變量的地址,你可以定義指針這樣的:

int *mypointer = NULL; 
int x = 10; 
//store the address of variable x 
mypointer = &x; 

我們知道,指針變量只是存儲,這只是一些人的地址。因此那個指針變量在內存空間中也有地址。如何存儲指針的地址?我們可以這樣做:

int *mypointer = NULL; 
int x = 10; 
//the pointer store the x's address 
mypointer = &x; 

//define a pointer to store the pointer variable mypointer's address 
int **newpointer = &mypointer; 

所以,char **與int **類似。

類型size_t是unsigned int或其他類型。注意size_t是無符號類型,無論size_t是int類型還是其他人。類型ssize_t供在C.符號類型爲簡單起見,爲size_t 也許定義如下:

typedef unsigned int size_t; 
typedef int ssize_t; 
+4

它也可以等同於'typedef unsigned long size_t;'或'typedef unsigned long long size_t;'或者其他實現看起來合適。 –

+1

是的,你是對的。實際上,我們不應該猜測size_t的確切定義。但是我們可以在C頭文件中找到它的定義。如果我們在size_t和ssize_t之間有所區別,這很酷。例如,讀取 或write函數中的size_t和ssize_t類型決定了這些函數可以運行的最大字節數(從文件讀取或寫入文件)。這些函數的reture類型是ssize_t,以便這些函數在調用失敗時返回-1。但是這限制了從文件或文件操作字節的功能。 – WangYang