Zudem schreibt der Autor:
> Folgendes funktioniert nicht:
1
char*eingabe(char*str){
2
charinput[MAX];
3
4
printf("Bitte \"%s\" eingeben: ",str);
5
fgets(input,MAX,stdin);
6
returninput;// FEHLER
7
}
Warum ist mir klar: Der Speicherbereich in dem "input" liegt ist nachdem
die Funktion verlassen wird wieder freigegeben. Es ist also nur eine
Frage der Zeit, bis etwas anderes diesen Berreich überrschreibt.
Allerdings ist mir nicht ganz klar, warum dieser Fehler im ersten
Codebeispiel nicht auftreten soll, desshalb habe ich mal einen Test
gemacht:
Adresse von input: 0x7fff8c20c4c0 # hier liegt "input" im Unterprogramm
4
Adresse von ptr: 0x7fff8c20c4c0 # die main liest aber aus diesem Berreich, obwohl der doch ungeschützt ist (?)
5
Hallo max
6
Bitte "Nachname" eingeben: mustermann
7
Adresse von input: 0x7fff8c20c4c0
8
musterma, interssanter Nachname # hier hat anscheinend sogar schon etwas anderes eine NULL nach dem 'a' hingeschrieben...
Ich hätte vermutet, dass die strtok-Funktion ein eigenes static
char-Arry anlegt, und der Adressbereich somit nicht mehr freigegeben
wird (was wohl ziemlich ressourcenverschwendend wäre), aber man sieht ja
dass der Pointer der gleiche bleibt, also die Funktion nichts eigenes
anlegt..
Ist das Beispiel im Buch falsch? Oder versteh ich hier was nicht?
Viele Grüße
Simon
Dein input[] liegt auf dem Stack, da gehört das nicht hin.
Wenn Du den Inhalt weiterverwenden willst, deklariere ihn als
static.
strtok() ist auch mit Vorsicht zu verwenden, es verändet den
ausgewertetn String.
Nicht alles Gedruckte ist richtig.
Lokale Variable sind nach return nicht mehr gültig.
Hat man ihre Adresse noch parat, dann kann die Variable (ein Teil) noch
existiert, muß aber nicht.
Du hast recht mit deiner Vermutung, Super erkannt. Glückunsch.
Das ist aber nicht der einzige Fehler in dem Buch.
strtok verändert den Eingabestring, indem es an Stelle der Trennzeichen
ein '\0' schreibt.
Vielen Dank für eure Antworten :)
Na, dann ist ja jetzt alles klar. Ich glaube ich kann behaupten, Pointer
verstanden zu haben^^
Den K&R werd ich mir wohl demnächst noch holen, scheint ja sehr gut zu
sein.
Leider ist die letzte Ausgabe K&R noch auf dem Stand von C89. Für C99
und erst recht für C11 braucht man zusätzliche Quellen. Trotzdem finde
ich das Buch gut, denn es ist vollständig, relativ dünn (<300 Seiten),
und dennoch ein richtiges Lehrbuch und nicht nur eine Sprachreferenz.
Yalu X. schrieb:> Leider ist die letzte Ausgabe K&R noch auf dem Stand von C89.
Das wird sich mit diesen Autoren wohl auch nicht mehr ändern. Wär also
die Frage, welches der Bücher über mindestens C99 empfehlenswert ist.
Joachim Drechsel schrieb:> K&R haben mal C entwickelt. Verlaß Dich drauf, die kennen C ;)
Wikipedia: "Kernighan has said that he had no part in the design of the
C language" - der hat am Buch mitgeschrieben, aber nicht am Design der
Sprache. Das war Ritchie.