2017-06-21 5 views
0

Ich sehe diese Zeile direkt nach dem Einschließen und vor der Hauptfunktion.Bitte erläutern Sie diese Deklaration der POSIX getline() Funktion

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

Was ich

  • getline ableiten kann, ist eine Funktion, die drei Eingabeparameter nimmt. Ich verstehe auch, den Dateizeiger (3. Argument)

Wo ich

  • ich die anderen zwei Eingangsparameter und size_t getline nicht verstehen bin stecken.
  • Ist size_t der Typ hier?
  • Was bedeuten auch zwei * s? Ich dachte, eine einzige * ist für Zeiger.
+1

Siehe Funktionsbeschreibung bei http://man7.org/linux/man-pages/man3/getline.3. html –

+0

Sie sollten ** IMMER ** RTFM! – Stargateur

+1

Sie sollten beachten, dass POSIX sagt, dass ['getline()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html) ein 'ssize_t' (ein signierter Typ der gleichen Größe) zurückgibt als vorzeichenloser Typ 'size_t'). Wenn also der Header '' enthalten ist und die POSIX-Deklarationen aktiviert sind, wird der Code aufgrund des Unterschieds zwischen dem offiziellen Prototyp und dem in der Frage angegebenen nicht kompiliert. –

Antwort

3

size_t ist ein Typ. Es ist wahrscheinlich in einer der Header-Dateien definiert, die enthalten sind. Die Funktion gibt einen Wert dieses Typs zurück, und ihr zweiter Parameter ist ein Zeiger auf einen Wert dieses Typs.

Sie haben richtig, dass * einen Zeiger angibt. So ist ** ein Zeiger auf einen Zeiger. So ist der Funktionsparameter lineptr die Adresse eines Speicherplatzes (A) im Speicher, der die Adresse eines anderen Speicherplatzes (B) im Speicher enthält; Die Daten am zweiten Standort sollten als char Werte interpretiert werden. Dies bedeutet, dass die Funktion den an Position A gespeicherten Wert ändern könnte, um auf eine andere Position als B zu zeigen.

2

Zeigervariable benötigt Speicher zum Speichern des Werts, der eine Adresse des Speichers ist. Wenn Sie eine Zeigervariable definieren möchten Adresse eines int-Typ Variable zu speichern, können Sie den Zeiger wie folgt definieren:

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

Wie wir wissen, ist die Zeigervariable nur jemand die Adresse zu speichern, die nur eine Zahl ist, . Somit hat diese Zeigervariable auch eine Adresse im Speicherraum. Wie speichert man die Adresse des Zeigers? Wir können das so machen:

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; 

Also, char ** ist ähnlich mit int **.

Der Typ size_t ist unsigned int oder anderer Typ. Anmerkung size_t ist ein vorzeichenloser Typ, unabhängig davon, ob size_t der Typ von int oder jemand anderes ist. Typ ssize_t ist Typ in C. Zur Vereinfachung unterzeichnet, size_t vielleicht wie folgt definieren:

typedef unsigned int size_t; 
typedef int ssize_t; 
+4

posten Es kann auch definiert werden, äquivalent zu 'typedef unsigned long size_t;' oder 'typedef unsigned long lang size_t; 'oder wie auch immer die Implementierung sieht. –

+1

Ja, Sie haben Recht. Eigentlich sollten wir die genaue Definition von size_t nicht erraten. Aber wir können die Definition in jemand C-Kopf-Datei bekommen. Das ist cool, wenn wir einen Unterschied zwischen size_t und ssize_t machen können. Zum Beispiel bestimmt der Typ size_t und ssize_t in der Funktion read oder write, wie maximale Bytes diese Funktionen bedienen können (aus Datei lesen oder in Datei schreiben). Der reture-Typ dieser Funktion ist ssize_t, so dass diese Funktionen -1 zurückgeben, wenn sie nicht aufgerufen haben. Aber das begrenzt die Funktionalität, Bytes von oder zu Datei zu betreiben. – WangYang

Verwandte Themen