Macht dies…
char* myString = "hello";
… haben die gleiche Wirkung wie diese?
char actualString[] = "hello";
char* myString = actualString;
Macht dies…
char* myString = "hello";
… haben die gleiche Wirkung wie diese?
char actualString[] = "hello";
char* myString = actualString;
BlueRaja – Danny Pflughöft
Nein.
char str1[] = "Hello world!"; //char-array on the stack; string can be changed
char* str2 = "Hello world!"; //char-array in the data-segment; it's READ-ONLY
Das erste Beispiel erstellt ein Array der Größe 13*sizeof(char)
auf dem Stapel und kopiert die Zeichenfolge "Hello world!"
hinein.
Das zweite Beispiel erstellt a char*
auf dem Stack und verweist auf eine Stelle im Datensegment der ausführbaren Datei, die die Zeichenfolge enthält "Hello world!"
. Diese zweite Saite ist SCHREIBGESCHÜTZT.
str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program!
Ich nehme an, Sie meinten char str1[]
Anstatt von char[] str1
.
– Alok Singhal
20. Januar 2010 um 3:08 Uhr
Aus diesem Grund warnen einige Compiler Sie, es sei denn, Sie schreiben const char* blah="blahblah"
– Gnud
20. Januar 2010 um 12:21 Uhr
Diese Antwort erklärt die Gründe dafür.
– Laser
26. September 2010 um 18:09 Uhr
Das ist auch der Grund, warum in C++ die Initialisierung von a char*
Das Zeigen auf ein Zeichenfolgenliteral wird zugunsten des Erfordernisses des Zeigers als veraltet markiert char const*
. Nicht unbedingt relevant für diese C-Frage, verstehe ich; es demonstriert jedoch die Fakten des Szenarios.
– Leichtigkeitsrennen im Orbit
6. April 2011 um 22:12 Uhr
Es ist erwähnenswert, dass: im ersten Beispiel der str1-Zeiger nicht geändert werden kann. Das heißt, ich kann str1 = some_other_pointer nicht ausführen. Im zweiten Beispiel kann ich str2 = some_other_pointer ausführen.
– Rajya Vardhan
15. April 2011 um 13:25 Uhr
Nein. Der erste gibt Ihnen einen Hinweis darauf const
Daten, und wenn Sie irgendein Zeichen über diesen Zeiger ändern, ist es ein undefiniertes Verhalten. Der zweite kopiert die Zeichen in ein Array, was nicht der Fall ist const
sodass Sie alle Zeichen (entweder direkt im Array oder über einen Zeiger) nach Belieben ohne negative Auswirkungen ändern können.
Eli Bendersky
Nein. Im ersten können Sie die Zeichenfolge, auf die verwiesen wird, nicht ändern myString
, im zweiten können Sie. Lesen Sie hier mehr.
Es ist nicht dasselbe, weil das unbenannte Array auf by zeigt myString
im ersten Beispiel ist schreibgeschützt und hat eine statische Speicherdauer, während das benannte Array im zweiten Beispiel beschreibbar ist und eine automatische Speicherdauer hat.
Andererseits ist dies näher gleichwertig sein:
static const char actualString[] = "hello";
char* myString = (char *)actualString;
Es ist jedoch immer noch nicht ganz dasselbe, da die von String-Literalen erstellten unbenannten Arrays nicht garantiert eindeutig sind, während explizite Arrays dies sind. Also im folgenden Beispiel:
static const char string_a[] = "hello";
static const char string_b[] = "hello";
const char *ptr_a = string_a;
const char *ptr_b = string_b;
const char *ptr_c = "hello";
const char *ptr_d = "hello";
ptr_a
und ptr_b
sind garantiert ungleich zu vergleichen, wohingegen ptr_c
und ptr_d
kann entweder gleich oder ungleich sein – beide sind gültig.
Es sieht so aus, als hätten Sie Code, der leicht kompiliert und getestet werden kann … warum testen Sie ihn nicht?
– Thomas Owens
19. Januar 2010 um 19:35 Uhr
Er fragt nicht, ob es funktioniert oder kompiliert. Er fragt, ob beide Aussagen die gleiche Wirkung haben (auch bekannt als auf die gleiche Weise funktionieren). Worauf die Antwort nein ist.
– Yannick Motton
19. Januar 2010 um 19:36 Uhr
etwas verwandt: stackoverflow.com/questions/2073079/…
– Jldupont
19. Januar 2010 um 19:40 Uhr
“Warum testest du es nicht?” ist eine gefährliche Frage, wenn es um C und C++ geht. Viele Verhaltensweisen sind durch den Standard nicht definiert (und daher ist es im Allgemeinen falsch, wenn Programme das Verhalten aufrufen), aber dies ist möglicherweise nicht durch einfaches Testen des Codes ersichtlich.
– Kef Scheiter
1. Juni 2017 um 20:17 Uhr