2 Stimmen

char * variable Adresse vs. char [] variable Adresse

Ich drucke Adressen und Zeichenketten aus den folgenden zwei Deklarationen und Initialisierungen aus:

  char * strPtr = (char *) "This is a string, made on the fly.";
  char charArray [] = "Chars in a char array variable.";

Beim Ausdruck ergibt sich folgende Ausgabe mit wild unterschiedlichen Adressen für die Variablen charArray und strPtr. Die Frage ist: "Warum?"

Drucken:

  printf( "%10s%40s%20p\n", "strPtr", strPtr, &(*strPtr));    
  printf( "%10s%40s%20p\n", "charArray", charArray, charArray);

Sortie :

    strPtr      This is a string, made on the fly.            0x400880    
 charArray         Chars in a char array variable.      0x7fff12d5ed30

Die verschiedenen Adressen sind, wie Sie sehen, folgende: 0x400880 vs. 0x7fff12d5ed30

Der Rest der zuvor deklarierten Variablen hat Adressen wie die von charArray.

Auch hier lautet die Frage: "Warum sind die Adressen so unterschiedlich?" Danke für jede Hilfe.

4voto

Alex Budovski Punkte 17158

Denn String-Literale, z.B. "foo bar", werden an einem anderen Ort zugewiesen als Ihr char-Array.

Esto es Implementierungsabhängig aber eine typische Implementierung setzt String-Literale in Ihre .rdata ("Nur-Lese-Daten") Ihrer ausführbaren Datei, und Ihr char-Array wird lokal deklariert und befindet sich daher auf dem Stack.

Und verschiedene Abschnitte Ihres Bildes werden beim Laden in den Arbeitsspeicher auf sehr unterschiedliche Adressen abgebildet.

3voto

Tim Punkte 19787

Ich vermute, dass der Compiler/Linker das Char-Array auf den Stack legt, während die andere Zeichenkette in eine statische Stringtabelle gelegt wird.

2voto

Karl Knechtel Punkte 55450

Der Text "Chars in a char array variable." und "This is a string, made on the fly." liegen wahrscheinlich recht nahe beieinander. Wie auch immer, char charArray[] = ... fordert Platz auf dem Stack an, in den das entsprechende Textbit kopiert wird. Der Stack befindet sich praktisch in einem anderen Universum als der ursprüngliche hartkodierte Text, sobald das Betriebssystem mit seiner Virtualisierung usw. fertig ist.

2voto

Srikar Appalaraju Punkte 68866

Das geht so - ich erinnere mich, dass ich darüber in [ Unix: Systemprogrammierung ]

1 alt text

Wie Sie sehen können, werden initialisierte statische Daten an einem anderen Ort auf dem Heap gespeichert als nicht initialisierte statische Daten.

1voto

caf Punkte 224189

Entscheidend ist dabei, dass im Falle von strPtr haben Sie es zu tun mit zwei verschiedene Objekte, während im Falle von charArray haben Sie es nur mit eine .

charArray ist ein einzelnes Array-Objekt, gefüllt mit den Zeichen der "Chars in a char array variable." String.

strPtr selbst ist ein einzelnes Zeigerobjekt. Sein Wert ist die Adresse eines zweiten anonymen, nicht änderbaren Array-Objekts, das wiederum die Zeichen der "This is a string, made on the fly." String.

Wenn Sie ausdrucken charArray mit %p drucken Sie die Adresse von charArray[0] (aufgrund einer Sonderregel für Arrays). Wenn Sie ausdrucken &(*strPtr) (was genau dasselbe ist wie nur strPtr ), drucken Sie die Adresse des anonymen, unveränderlichen Array-Objekts, das bereits erwähnt wurde - und das ist der Grund, warum es so anders aussieht als die Adressen der anderen beteiligten Variablen.

Wenn Sie ausdrucken &strPtr mit %p werden Sie sehen, dass die Adresse der Variablen strPtr selbst liegt in einem ähnlichen Bereich wie die anderen lokalen Variablen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X