2015-08-03 8 views
5

In C können wir char * verwenden, um auf einen String zu zeigen. Genau wieWo wird eine char-pointing-Zeichenfolge LOGICALLY gespeichert?

char *s = "Hello"; 

.

Wie man sieht, befindet sich weder die Variable dynamisch auf dem Heap, weil es keine dynamischen Funktionen wie malloc gibt, noch ist sie definiert, um auf eine bestimmte andere Variable zu zeigen.

Also meine Frage ist, Wo ist der Literal-String welche Variable [char * s] zeigt auf logisch gespeichert?

Ist es im Stapel wie alle normalen lokalen Variablen gespeichert? oder etwas wie Stapel?


Eigentlich bin ich ein Absolvent der Computer-Engineering-Abteilung, aber ich habe nicht gefunden und haben zu viel neugierig gewesen, wie [char * string] arbeitet logisch. Es ist wirklich eine große Ehre, jetzt diesen hier zu fragen.

+1

Es wird im Textsegment –

+1

@RaghuSrikanthReddy nicht unbedingt gespeichert. Viele Plattformen setzen Zeichenfolgenliterale in den Abschnitt "Rodata". – fuz

+2

mögliche Duplikate von [wo im Speicher sind Stringliterale? Stack/Heap?] (http://stackoverflow.com/questions/4970823/where-in-memory-are-string-literals-stack-heap) – juanchopanza

Antwort

2

Es gibt nichts besonderes an s, es ist ein Zeiger, es zeigt irgendwo. Es hat automatische Speicherdauer genau wie jede andere lokale Variable nicht static deklariert. Was jedoch "speziell" ist, ist das String-Literal, auf das Sie zeigen.

Sie können sich ein String-Literal wie "foo" als unbenannte globale Variable mit einigen besonderen Einschränkungen vorstellen. Diese Einschränkungen sind:

  • Sie nicht auf die Stringliteral schreiben kann, als ob er als const
  • Zwei Stringliterale erklärt vielleicht die gleiche Adresse teilen oder überlappen
13

Die Variable char* s wird gespeichert auf der Stapel, vorausgesetzt, dass er in einem Funktionskörper deklariert ist. Wenn es in einer Klasse deklariert ist, wird es dort gespeichert, wo das Objekt für die Klasse gespeichert ist. Wenn es als global deklariert ist, wird es im globalen Speicher gespeichert.

In der Tat, jede nicht static und nicht thread_local Variable, die Sie in diesen drei Positionen erklären verhalten sich genauso, unabhängig davon, ob es sich um eine primitive (dh int), ein Objekt (dh vector<int>) oder ein Zeiger (dh const char*). Wenn eine Variable statisch ist, wird sie immer im globalen Bereich gespeichert. Wenn eine Variable thread_local ist, erhält jeder Thread seine eigene Kopie, und diese Kopie wird normalerweise an der Basis des Stapels für den entsprechenden Thread gespeichert.

Die tatsächliche Zeichenfolge "Hello", auf die s verweist, wird irgendwo in einem konstanten globalen Speicherplatz gespeichert, normalerweise das .data-Segment.

+0

Wo 's' gespeichert wird, hängt davon ab, wo es definiert ist. Es wird normalerweise auf dem Stack gespeichert, wenn es sich um einen lokalen Wert handelt (innerhalb einer Funktion oder eines Blocks), aber nicht, wenn es sich um eine globale Variable handelt. Außerdem muss es * nicht * auf dem Stack gespeichert werden, die C-Spezifikation gibt nicht wirklich an, wo lokale Variablen gespeichert werden sollen, es gibt nur den Variablenbereich und die Lebensdauer an. –

+0

Nun, ich bin jetzt ein bisschen, um mich an die Grundlagen der 'Betriebssystem' Studie in meinem College zu erinnern. Ich glaube, ich habe das "Text" -Segment schon einmal gekritzelt, dann scheine ich das Buch noch einmal zu überprüfen. Danke. –

+1

Diese Antwort ist sehr implementierungsspezifisch. Einige Implementierungen haben keine Textsegmente, Stapel und so weiter. –

3

Zeichenfolgenliterale haben statische Speicherdauer. Das bedeutet, sie existieren für die gesamte Lebensdauer Ihres Programms. Sie können in einem nicht beschreibbaren Bereich gespeichert werden und sie können sich mit anderen Zeichenfolgenliteralen überlappen. Zwei verschiedene Instanzen desselben Literals können übereinstimmen oder nicht.

Es liegt an Ihrer Implementierung (Compiler/Linker/etc). eine Entscheidung treffen, die diesen Anforderungen entspricht.