Ich weiß, wofür wir dieses Argument verwenden, und ich weiß sogar, wie ich mit dem Argument arbeiten soll.
Es gibt nur eine Sache, 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 segfault erwartet, aber es ist nicht passiert.
Weiß jemand, wie diese Speicherzuweisung funktioniert?
Die C / C ++ - Laufzeit verarbeitet die Befehlszeilenargumente und erstellt einen Speicherbereich, in den die Argumente eingefügt werden. Dann ruft sie Ihr main()
auf und liefert Ihnen die Anzahl der Argumente zusammen mit einem Zeiger auf den Bereich, in dem die Argumente gespeichert sind.
So besitzt die C / C ++ - Laufzeit den zugewiesenen Speicherbereich, und es liegt an der C / C ++ - Laufzeit, den Bereich wieder freizugeben, wenn Ihr main()
zurückkehrt oder wenn eine andere C / C ++ - Funktion zum Stoppen des Programms verwendet wird exit()
.
Diese Prozedur entstand mit der Verwendung von C unter Unix und wurde für C ++ als Teil der Bereitstellung der Abwärtskompatibilität beibehalten, die das C ++ - Komitee versucht hat zu erhalten.
Normalerweise, wenn Ihr Programm geladen wird, ist der Einstieg, der vom Loader gestartet wird, nicht Ihre main()
-Funktion, sondern ein in der C / C ++ - Laufzeit definierter Einstiegspunkt. Die C / C ++ - Laufzeitumgebung führt verschiedene Arten der Initialisierung durch, 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 von Befehlszeilenargumenten, die der Funktion main()
als Funktionsargumente zur Verfügung gestellt werden.