argv Gültigkeit
-
Wie sieht die Gültigkeit von argv aus?
Der Speicher ist wahrscheinlich nicht alloziert (sonst wären da viele Programme mit memory leaks da draußen)
Aber es wäre nicht richtig einfach einen const char * pointer auf argv[3] zu setzen oder?
const char *globalroot; int main(int argc, char **argv) { globalroot = argv[3]; }
Stehe irgendwie momentan auf dem Schlauch. Die Frage scheint so simpel zu sein...
-
argv wird ganz am Anfang des Programms von demjenigen reserviert, der dein Programm aufgerufen hat - und nach dem exit() (bzw. der Rückkehr aus der main) wieder vernichtet. Das heißt, solange dein Programm läuft, kannst du es auch bedenkenlos verwenden.
(außer natürlich, du zerschießt dir selber den Inhalt von argv)
-
doch, wieso nicht? Vorausgesetzt natürlich, dass argv[3] überhaupt existiert, eine vorherige Abfrage von argc wäre also sinnvoll.
-
Die Gültigkeit von argv und dem worauf es zeigt ist ganz genau so wie bei jeder anderen Funktion auch. main bildet da keine Ausnahme. Die Verantwortung für den Speicher auf den die argv zeigen liegt bei dem der main aufgerufen hat, die main hat da gefälligst die Finger von zu lassen.
Beantwortet das deine Frage? Ich bin mir ehrlich gesagt nicht ganz sicher, was du meinst, insbesondere was das mit gloabalroot und argv[3] soll.
edit: Zu spät. Und andere haben das was mir unklar war verstanden und bereits richtig beantwortet.
-
Irgendwie logisch
Danke für die Antworten!
-
Wie sieht's mit atexit() aus, ist da der main() Scope noch gültig?
-
cooky451 schrieb:
Wie sieht's mit atexit() aus, ist da der main() Scope noch gültig?
Nein, so lange main noch läuft, läuft das Programm noch.
-
cooky451 schrieb:
Wie sieht's mit atexit() aus, ist da der main() Scope noch gültig?
Der Scope von main nicht, aber der Standard macht explizit eine Ausnahme für argc und argv:
ISO/IEC 9899:1999 5.1.2.2.1 (2) schrieb:
The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.
Ausschlaggebend ist hier also nicht, ob main bereits beendet wurde oder nicht, sondern ob das Programm terminiert wurde. "Program termination" ist definiert als
ISO/IEC 9899:1999 5.1.2 schrieb:
5.1.2 Execution environments
1 Two execution environments are defined: freestanding and hosted. In both cases, program startup occurs when a designated C function is called by the execution environment. All objects with static storage duration shall be initialized (set to their initial values) before program startup. The manner and timing of such initialization are otherwise unspecified. Program termination returns control to the execution environment.
(Unterstreichungen von mir)
Natürlich sind die Namen argc und argv in einer per atexit registrierten Funktion nicht mehr bekannt, aber du kannst locker einen Zeiger auf argv irgendwo ablegen und nach dem Ende von main noch benutzen - die Kontrolle liegt zu diesem Zeitpunkt ja noch bei dir und nicht bei der execution environment.