Strings
-
Nehmen wir an ich habe folgenden Code:
char *msg = "Bestaetigen Sie bitte den Loeschvorgang"; // if (blabla) { msg = "Sie haben keine Zeile gewaehlt"; [...] return; }
Das funktioniert wunderbar....
Bekommt jetzt bei der Zuweisung im if msg einen neuen Speicherbereich oder wird der Bereich vom ersten "Bestaetigen Sie...." überschrieben??Gruss Unsicher
-
Naja, das sind zwei unabhängige Stringliterale die (irgendwo) im Speicher liegen. Durch die Zuweisung (in Zeile 5) verlierst du halt den Zeiger auf das erste Literal. Dieses wird aber noch unverändert "da" sein.
Überschreiben würdest du mit strcpy, aber da dürfte das Ziel halt kein Zeiger auf ein Literal sein sondern ein ausreichend großes, beschreibbares Stück Speicher.
-
Tim schrieb:
Naja, das sind zwei unabhängige Stringliterale die (irgendwo) im Speicher liegen. Durch die Zuweisung (in Zeile 5) verlierst du halt den Zeiger auf das erste Literal. Dieses wird aber noch unverändert "da" sein.
Überschreiben würdest du mit strcpy, aber da dürfte das Ziel halt kein Zeiger auf ein Literal sein sondern ein ausreichend großes, beschreibbares Stück Speicher.Im Grunde genommen wäre das dann so ein richtiger Programmierfehler (auf C bezogen) ??? Auch wenn es ja funktioniert...
-
Nein, das ist kein Fehler, es ist auch nicht unbedingt unschön*. Ich wollte lediglich die Hintergründe/Konsequenzen beleuchten.
* bei komplexeren Aufgaben wären evtl. andere Lösungen schöner
-
Jedes Mal, wenn ein String-Literal einem char* zugewiesen wird, tötet der Programmiergott ein niedliches, kleines Kätzchen auf unnötig grausame Weise. Besser:
char const *msg = "Bestaetigen Sie bitte den Loeschvorgang";
...dann kann der Compiler dir auch sagen, wenn du Schindluder treibst.
Ansonsten ist msg halt ein Zeiger. Du kannst ihn problemlos auf verschiedene Dinge zeigen lassen; du kannst halt nur nicht in dem rumschreiben, auf das er zeigt, wenn er gerade auf ein String-Literal zeigt. Das heißt:
char const *msg = "Bestaetigen Sie bitte den Loeschvorgang"; msg = "Hallo"; /* völlig in Ordnung */ msg[1] = 'e'; /* Kawumm! */
Mit const hält dich der Compiler übrigens auch davon ab, ohne findest du das erst zur Laufzeit raus. Anders ist es, wenn msg auf einen Speicherbereich zeigt, der dir gehört, beispielsweise
char puffer[] = "Hallo"; char *msg = puffer; msg[1] = 'e'; /* kein Problem. */
Natürlich musst du dabei darauf achten, in diesem Speicherbereich zu bleiben. Beispielsweise wäre
msg[6] = 'x'; /* Kawumm! */
im obrigen Beispiel verboten; puffer ist ein char[6], d.h. gültige Indices laufen von 0 bis 5.
-
Quatsch
-
Tim schrieb:
Quatsch
Ich denke @seldon meint so etwas wie das:
gchar *msg[] = { "Bestaetigen Sie bitte den Loeschvorgang", "Sie haben keine Zeile gewaehlt" }; [...] if (blabla) { mache mit msg[0] irgendetwas; [...] return; } else { mache mit msg[1] irgendetwas; [...] return; }
Danke für die Antworten
LG unsicher...
-
unsicher... schrieb:
Tim schrieb:
Quatsch
Ich denke @seldon meint so etwas wie das:
Sorry, das war blöd von mir. Ich habe was geschrieben und abgeschickt. Dann habe ich bemerkt, dass es totaler Quatsch war was ich geschrieben habe. Hätte schreiben sollen "Hier stand Quatsch". Aber es war auch schon spät