C - Müssen Zeichenketten (Strings) kopiert werden; Ein Scope Problem?
-
Hallo zusammen,
wenn ich eine Funktion schreibe, die als Parameter ein Pointer auf ein char hat, wobei hier ein mit Null-terminierte Zeichenkette (=String) erwartet wird, darf man diese Adresse weitergeben oder verliert Sie die gültigkeit nach verlassen der Funktion?
Um Verwirrung vorzubeugen hier ein bisschen Pseudocode:
char* MyString; // global! tu_irgendwas(char* string, char* name) { ... string=name; // hier weise ich die Adresse von "Hugo" einem Pointer zu ... } ... func(...) { ... tu_irgendwas(MyString,"Hugo"); // in dieser Funktion wird etwas mit der Adresse von "Hugo" gemacht ... printf("%s\n",MyString); // gebe "Hugo" auf der Konsole aus } ... main(...) { ... func(); printf("%s\n",MyString); // gebe "Hugo" auf der Konsole aus; ist das hier überhaupt zulässig? ... }
Wenn das nicht zulässig wäre müsste ich mit erstmal die strlen von "Hugo" bestimmen und dann mit malloc für MyString speicher holen. Danach müsste ich per strcopy (oder so ähnlich) den string umkoieren.
-
Hallo,
Die Funktion tu_irgendwas müsste so aussehen:tu_irgendwas(char** string,char* name) { ... *string = name; ... }
Zeile 13 müsste dann so lauten:
tu_irgendwas(&MyString,"Hugo");
So weist der Zeiger MyString nach dem Aufruf von tu_irgendwas auf die Zeichenkette "Hugo".
Wenn du dir die Adresse von "Hugo" einmal in der Funktion und einmal in main() ausgeben lässt, könntest du sehen, dass die Adressen gleich sind. Die Zeichenkette "Hugo" dürfe demnach nicht auf dem Stack liegen. Somit wird der Pointer MyString nach Verlassen der Funktion nicht ungültig.
MfG, Jochen
-
Hallo Jochen,
danke für deine Antwort.
Muss das mit dem Pointer auf Pointer wirklich sein? Ich denke das ist überflüssig.
In deinen beiden letzten Sätzen steckt im Grunde die Frage drin.
"Hugo" würde also laut deiner Aussage nicht auf dem Stack liegen.
D.h. eine Adresse einer String-Konstante ist immer und überall in einem C-Programm gültig!?Ist das vom C-Standard her so vorgesehen oder ist das Compiler-abhängig?
Gruß
-
stefan-tiger schrieb:
"Hugo" würde also laut deiner Aussage nicht auf dem Stack liegen.
D.h. eine Adresse einer String-Konstante ist immer und überall in einem C-Programm gültig!?Ist das vom C-Standard her so vorgesehen oder ist das Compiler-abhängig?
Ja, siehe 6.4.5 im Standard. Der String wird als Array mit static storage duration abgespeichert, also so wie eine globale Variable.
-
stefan-tiger schrieb:
Muss das mit dem Pointer auf Pointer wirklich sein? Ich denke das ist überflüssig.
Also, wenn ich das ohne den Pointer auf den Pointer kompiliere, bekomme wird nicht zweimal "Hugo" ausgegeben, sondern zweimal "(null)". Das liegt daran, dass du nicht den Zeiger MyString veränderst, sondern nur einen temporären Zeiger.
Die Funktion, wie du sie implementiert hast (mit einfachem Pointer) übergibt den Zeiger mit der Call-by-Value Technik, die Funktion mit dem char** - Parameter übergibt den Zeiger mit der Call-By-Reference Technik. So wird es ermöglicht, den Zeiger MyString zu verändern.
MfG, Jochen
-
Jochen S. schrieb:
stefan-tiger schrieb:
Muss das mit dem Pointer auf Pointer wirklich sein? Ich denke das ist überflüssig.
Also, wenn ich das ohne den Pointer auf den Pointer kompiliere, bekomme wird nicht zweimal "Hugo" ausgegeben, sondern zweimal "(null)". Das liegt daran, dass du nicht den Zeiger MyString veränderst, sondern nur einen temporären Zeiger.
Die Funktion, wie du sie implementiert hast (mit einfachem Pointer) übergibt den Zeiger mit der Call-by-Value Technik, die Funktion mit dem char** - Parameter übergibt den Zeiger mit der Call-By-Reference Technik. So wird es ermöglicht, den Zeiger MyString zu verändern.
MfG, Jochen
Achja, hätte ich auch drauf kommen müssen