Haben diese Aussagen über Pointer dieselbe Wirkung?

Lesezeit: 3 Minuten

Macht dies…

char* myString = "hello";

… haben die gleiche Wirkung wie diese?

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

  • 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

Benutzer-Avatar
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 constsodass Sie alle Zeichen (entweder direkt im Array oder über einen Zeiger) nach Belieben ohne negative Auswirkungen ändern können.

Benutzer-Avatar
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.

1252080cookie-checkHaben diese Aussagen über Pointer dieselbe Wirkung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy