2010-01-19 8 views
20

Tut dies ...Haben diese Aussagen über Zeiger den gleichen Effekt?

char* myString = "hello"; 

... die gleiche Wirkung wie diese haben?

char actualString[] = "hello"; 
char* myString = actualString; 
+2

Es sieht so aus, als ob Sie Code haben, der leicht kompiliert und getestet werden kann ... warum testen Sie ihn nicht? –

+0

Dies wurde eine Tonne gefragt! ~ – JonH

+16

Er fragt nicht, ob es funktioniert, oder kompiliert. Er fragt, ob beide Aussagen die gleiche Wirkung haben (aka Arbeit in der gleichen Weise). Worauf die Antwort nein ist. –

Antwort

33

No.

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 wird ein Array der Größe 13*sizeof(char) auf dem Stapel und kopiert die Zeichenfolge "Hello world!" hinein.
Das zweite Beispiel erstellt eine char* auf dem Stapel und verweist auf eine Position im Datensegment der ausführbaren Datei, die die Zeichenfolge 10 enthält. Diese zweite Zeichenfolge ist READ-ONLY.

str1[1] = 'u'; //Valid 
str2[1] = 'u'; //Invalid - MAY crash program! 
+1

Ich nehme an, du meintest 'char str1 []' statt 'char [] str1'. –

+2

Dies ist, warum einige Compiler Sie warnen, es sei denn, Sie schreiben 'const char * blah =" blahblah "' – gnud

+0

[Diese Antwort] (http://stackoverflow.com/questions/349025/is-a-string-literal-in- c-created-in-static-memory/349030 # 349030) erläutert die Gründe dafür. – Lazer

3

Nein, in der ersten, können Sie die Zeichenfolge von myString, in der zweiten darauf nicht ändern Sie können. Lesen Sie mehr here.

4

No. Der erste gibt Ihnen einen Zeiger auf const Daten, und wenn Sie über diesen Zeiger auf jedes Zeichen ändern, ist es nicht definiertes Verhalten. Der zweite kopiert die Zeichen in ein Array, das nicht const ist, so dass Sie beliebige Zeichen (entweder direkt im Array oder über den Zeiger) beliebig ändern können, ohne dass es zu Beeinträchtigungen kommt.

3

Es ist nicht dasselbe, weil das unbenannte Array, auf das im ersten Beispiel myString zeigt, schreibgeschützt ist und statische Speicherdauer hat, während das benannte Array im zweiten Beispiel beschreibbar ist und automatische Speicherdauer hat.

Auf der anderen Seite, ist dies näher zu gleichwertig:

static const char actualString[] = "hello"; 
char* myString = (char *)actualString; 

Es ist immer noch nicht ganz dasselbe aber, weil die unbenannte Arrays von Zeichenketten erstellt werden nicht garantiert eindeutig, während explizite Arrays sind. So in dem 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 ungleich vergleichen sind garantiert, während ptr_c und ptr_d kann entweder gleich oder ungleich sein - beide gültig sind.

Verwandte Themen