funktion gibt strtok(lokale variable, ...) zurück, warum funktionierts?
-
Nabend!
Ich beacker grad ein Beispiel aus "C von A bis Z" und würde gern wissen, warum diese Funktion einen Zeiger auf eine in der Funktion deklarierte Variable zurückliefern kann bzw. warum dieser Zeiger nach Beendigung der Funktion überhaupt noch auf irgendetwas zeigt.
char *eingabe(char *str) { char input[MAX]; printf("Bitte Namen eingeben: ",str); fgets(input, MAX, stdin); return strtok(input,"\n"); }
Ich hab das zwar ausprobiert (--> funzt). Aber geht die Variable input nicht "verloren" nachdem die Funktion beendet ist? Oder ist es so, dass strtok die Variable in die aufrufende Funktion quasi "mitnimmt"?? Wird dann die Variable input irgendwie neu angelegt oder wie ist das?
Danke schonmal für die Mühe
-
Würd_gern_C_können schrieb:
Aber geht die Variable input nicht "verloren" nachdem die Funktion beendet ist?
richtig.
nach verlassen der funktion ist der speicher wieder frei. es geht nur deshalb noch "gut", weil in der zeit vielleicht noch keiner wieder in den speicher geschrieben hat.wo stehtn das in dem buch? lies mal weiter. da muss stehen, dass dieser code falsch ist.
-
http://www.pronix.de/pronix-743.html
unter 14.6.1
also soweit ich das bis jetzt gelesen habe, kommt da ein anderes beispiel, das demonstrieren soll, was mit lokalen variablen passiert. guck ma rein, vielleicht bin ich grad betriebsblind...
edit: ich seh grad, dass sich "guck ma rein" bisschen unhöflich anhört. Ich meinte natürlich: Vielleicht hast Du ja kurz Zeit da mal reinzuschauen
-
Würd_gern_C_können schrieb:
edit: ich seh grad, dass sich "guck ma rein" bisschen unhöflich anhört. Ich meinte natürlich: Vielleicht hast Du ja kurz Zeit da mal reinzuschauen
passt schon. ich bins gewohnt und zu viel hoeflichkeit wirkt im internet fast gegenteilig.
zum problem. pronix ist so ne sache. manche sagen, es haette so einige fehler. ich selber kann mich nicht erinnern, von konkreten fehlern gehoert zu haben.
der code ueber den du dich wunderst, der ist wirklich falsch, denn nachdem die funktion zurueckkehrt, wird der stackspeicher ja wieder freigegeben und zeiger in den bereich zeigen dann auf ungewisse daten.
pronix sagt etwas in der richtung erst ueber den naechsten code, der den pointer direkt returnt und nicht das ergebnis von strtok. scheint also doch mal wieder ein fehler im pronix buch zu sein.strtok arbeitet naemlich destruktiv, also der uebergebene string wird veraendert und zeiger darauf returnt. beide codes returnen also zeiger auf speicher, der dem programm zu dem zeitpunkt nicht mehr gehoert.
-
passt schon. ich bins gewohnt und zu viel hoeflichkeit wirkt im internet fast gegenteilig.
war aber nicht gegenteilig gemeint...
Ok, wenn also Speicher wieder freigegeben wird, dann bleibt das, was vorher drin geschrieben war, noch so lange bestehen, bis etwas anderes drübergeschrieben wird. Wieder was gelernt - ich dachte das wird gleich gelöscht oder so.
Aus diesem Grund funktioniert dann auch dieses Beispielprogramm. Der Zeiger zeigt auf nicht (mehr) reservierten Speicher, in dem trotzdem noch die Variable drin steht.
Danke!