2014-09-15 8 views
8

Ich weiß, wofür wir dieses Argument verwenden, und ich weiß sogar, wie man mit dem Argument arbeitet.Speicherzuweisung und ** argv Argument

Es gibt nur ein Dinge, die ich immer noch nicht verstehe. Wie ein Programm Speicher für Strings reserviert, die von der Eingabe stammen. ** argv hat am Anfang des Programms keinen Speicher zugewiesen, oder? Ich habe mit segfault gerechnet, aber es ist nicht passiert.

Weiß jemand, wie diese Speicherzuweisung funktioniert?

+1

was was? nicht wahr? – thang

+2

Was meinst du mit "hat keinen reservierten Speicher"? Die Zeiger in 'argv' sind alle gültig und zeigen auf Speicher, auf den sicher zugegriffen werden kann. Welchen Code haben Sie erwartet, um einen Segfault zu erzeugen? – Wyzard

+4

Es wird von der Laufzeitbibliothek zugewiesen, bevor 'main()' aufgerufen wird. –

Antwort

12

Die C/C++ - Laufzeit verarbeitet die Befehlszeilenargumente und erstellt einen Speicherbereich, in den die Argumente eingefügt werden. Es ruft dann Ihre main() auf, die Ihnen eine Anzahl der Argumente zusammen mit einem Zeiger auf den Bereich bereitstellt, in dem die Argumente gespeichert werden.

So ist die C/C++ Runtime besitzt den Bereich Speicher zugewiesen und es ist bis zu dem C/C++ Runtime den Bereich, sobald Ihre main() wieder freigeben oder wenn eine andere C/C++ Funktion verwendet wird, um das Programm zu stoppen, wie exit() .

Dieses Verfahren entstand mit der Verwendung von C unter Unix und wurde für C++ als Teil der Bereitstellung der Grad der Abwärtskompatibilität, die das C++ - Komitee versucht hat, zu erhalten, beibehalten.

Normalerweise, wenn Ihr Programm geladen wird, ist der Einstieg, der vom Loader gestartet wird, nicht Ihre main() Funktion, sondern ein Einstiegspunkt, der in der C/C++ Laufzeit definiert ist. Die C/C++ - Laufzeitumgebung führt verschiedene Arten der Initialisierung aus, um die von den C/C++ - Standards angegebene Umgebung zu dem Zeitpunkt einzurichten, an dem die main()-Funktion von der C/C++ - Laufzeit aufgerufen wird, sobald die Initialisierung abgeschlossen ist.

Einer der Schritte während dieser Initialisierung ist das Parsen der bereitgestellten Befehlszeilenargumente, die dann der main()-Funktion als Funktionsargumente zur Verfügung gestellt werden.