我在include函數和main函數之前看到這行。請詳細說明POSIX getline()函數的這個聲明
size_t getline(char **lineptr, size_t *n, FILE *stream);
我可以推斷
- 函數getline是一個函數,採用三個輸入參數。我也明白文件指針(第三個參數)
如果我堅持
- 我不明白其他兩個輸入參數,併爲size_t函數getline。
- size_t是這裏的類型嗎?
- 另外兩個
*
s是什麼意思?我認爲一個*
是指針。
我在include函數和main函數之前看到這行。請詳細說明POSIX getline()函數的這個聲明
size_t getline(char **lineptr, size_t *n, FILE *stream);
我可以推斷
如果我堅持
*
s是什麼意思?我認爲一個*
是指針。size_t
是一種類型。它可能在包含的頭文件之一中定義。該函數返回該類型的值,其第二個參數是指向該類型值的指針。
您確定*
表示指針。所以**
是一個指向指針的指針。所以函數參數lineptr
是內存中位置(A)的地址,它包含內存中另一個位置(B)的地址;第二個位置的數據應解釋爲char
值。這意味着函數可以將存儲在位置A的值改變爲指向除B以外的某個位置。
指針變量需要內存來存儲內存地址的值。如果你要定義一個指針變量來存儲一個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;
它也可以等同於'typedef unsigned long size_t;'或'typedef unsigned long long size_t;'或者其他實現看起來合適。 –
是的,你是對的。實際上,我們不應該猜測size_t的確切定義。但是我們可以在C頭文件中找到它的定義。如果我們在size_t和ssize_t之間有所區別,這很酷。例如,讀取 或write函數中的size_t和ssize_t類型決定了這些函數可以運行的最大字節數(從文件讀取或寫入文件)。這些函數的reture類型是ssize_t,以便這些函數在調用失敗時返回-1。但是這限制了從文件或文件操作字節的功能。 – WangYang
參見在http://man7.org/linux/man-pages/man3/getline.3功能說明。 html –
你應該**總是** RTFM! – Stargateur
你可能會注意到POSIX說['getline()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)返回一個'ssize_t'(一個相同大小的簽名類型作爲無符號類型'size_t')。所以,如果包含''標頭並且啓用了POSIX聲明,則由於正式原型與問題中引用的原型之間的區別,代碼將不會編譯。 –