String-Konstante als pointer - Zulässig?
-
Darf man das machen, solange man nicht in den Speicherbereich des Literals schreibt?
const char* str = "Hallo"; // anstatt const char str[] = "Hallo";
-
Die Frage kommt etwa alle zwei Tage... Benutz doch mal die Forensuche.
-
Sicher, alle zwei Tage... arroganter Flegel

-
hehe, dieser thread scheint lustig zu werden

-
wieso nicht? Was soll da nicht gehen?
PS: Wo DIESE Frage alle zwei Tage kommt, würde ich auch gerne wissen.
-
Stefan schrieb:
Darf man das machen, solange man nicht in den Speicherbereich des Literals schreibt?
const char* str = "Hallo"; // anstatt const char str[] = "Hallo";Du kannst auch bei ersterem "Hallo" nicht überschreiben. Es ist const char!
Du kannst nur str noch woanders hinzeigen lassen.Beim zweiten kannst du den Zeiger nicht mehr ändern!!!
-
Stefan schrieb:
Sicher, alle zwei Tage... arroganter Flegel

Naja, alle zwei Tage war übertrieben (was man aber auch merken könnte). Was ich damit sagen wollte, das schon häufig über
char[]vschar*diskutiert wurde. Das war im Weiteren nur ein Hinweis, deshalb brauchst du nicht gleich beleidigend zu werden.
Hier z.B. gab es etwas sehr Ähnliches. Und im C-Forum gibt es häufig solche Beiträge.Ich seh jetzt mal über deine Beleidigung hinweg und versuch trotzdem, dir zu helfen...
Thomy schrieb:
Du kannst auch bei ersterem "Hallo" nicht überschreiben. Es ist const char!
Du kannst nur str noch woanders hinzeigen lassen.Beim zweiten kannst du den Zeiger nicht mehr ändern!!!
Das stimmt nicht ganz. Die erste Version ist kein konstanter Zeiger, sondern ein Zeiger auf
const char. Den Zeiger selber kann man deshalb ändern, aber nicht den Inhalt, auf den er zeigt. "Hallo" kann insofern "überschrieben" werden (siehe Codebeispiel unten).Beim zweiten liegt kein Zeiger, sondern ein Array vor, dessen Grösse feststeht. So können die einzelnen Elemente dank
constnicht verändert werden.const char* str = "Hallo"; str = "Guten Tag"; // geht, Zeiger wird geändert strcpy(str, "Hi"); // geht nicht str[0] = 'h'; // geht nicht const char sts[] = "Hallo"; // hier kannst du nachträglich nichts ändern // (zumindest auf normale Weise nicht)
-
@Nexus: Ich nehme den "arroganten Flegel" zurück.
-
Danke, das ist nett von dir

Noch zu deiner Ausgangsfrage:
const char* str = "Hallo";ist erlaubt, weil für String-Literale Speicher reserviert wird (nicht für andere Literale). Das heisst,
strzeigt auf einen gültigen Speicherbereich.Bestehen zu deinem Problem noch weitere Fragen?
-
Danke für die klare Antwort.

Es ist nicht so, dass die Array-Variante zwei mal den Speicher für den String belegt, oder? Das heisst, im Fall einer Konstanten bietet keine der beiden Varianten eine Vorteil gegenüber der anderen?
-
Stefan schrieb:
Es ist nicht so, dass die Array-Variante zwei mal den Speicher für den String belegt, oder?
Doch, genau das sollte passieren. Der Inhalt des Stringliterals (das normalerweise im statischen Speicher rumliegt) wird in dein Array kopiert, bei der Zeigervariante hast du tatsächlich nur den Zeiger.
Das „erstaunlichere“ Phänomen ist, dass du die (konstanten) Stringliterale auch einem gewöhnlichen char-Zeiger zuweisen darfst.