6 Stimmen

Stack- und Heap-Adressen

Ich habe eine einfache Speicherzuweisung auf Stack und Heap in C ausprobiert.

int x = 2;
int *y = malloc(sizeof(int));

Wenn ich die Adresse von x auf dem Stack und die in y enthaltene Heap-Adresse betrachte, sehe ich Folgendes

x stack address : 0xbfe92bb4
heap address in y : 0x 9c4b008

Haben diese Adressen ein unterschiedliches Format (da ich in beiden nicht die gleiche Anzahl von Hex-Zeichen sehe)?

5voto

Fredrik Pihl Punkte 42950

Die Variablen werden in verschiedenen Speichersegmenten gespeichert.

Daten Der Datenbereich enthält globale und statische Variablen, die vom Programm verwendet und initialisiert werden. Dieses Segment kann weiter in einen initialisierten Nur-Lese-Bereich und einen initialisierten Schreib-Lese-Bereich unterteilt werden. Zum Beispiel würde die Zeichenkette, die in C durch char s[] = "hello world" definiert ist, und eine C-Anweisung wie int debug=1 außerhalb von "main" im initialisierten Schreib-Lese-Bereich gespeichert werden. Und eine C-Anweisung wie const char* string = "hello world" bewirkt, dass das String-Literal "hello world" im initialisierten Nur-Lese-Bereich und die Zeichenzeigervariable string im initialisierten Schreib-Lese-Bereich gespeichert wird. Beispiel: static int i = 10 wird im Datensegment gespeichert und global int i = 10 wird im Datensegment gespeichert

Heap Der Heap-Bereich beginnt am Ende des BSS-Segments und wächst von dort aus zu größeren Adressen. Der Heap-Bereich wird von malloc, realloc und free verwaltet, die die Systemaufrufe brk und sbrk verwenden können, um seine Größe anzupassen (beachten Sie, dass die Verwendung von brk/sbrk und eines einzigen "Heap-Bereichs" nicht erforderlich ist, um den Auftrag von malloc/realloc/free zu erfüllen; sie können auch mit mmap implementiert werden, um potenziell nicht zusammenhängende Regionen des virtuellen Speichers im virtuellen Adressraum des Prozesses zu reservieren). Der Heap-Bereich wird von allen gemeinsam genutzten Bibliotheken und dynamisch geladenen Modulen in einem Prozess gemeinsam genutzt.

Setzen Sie Ihre Untersuchungen fort unter wikipedia

5voto

Ofir Punkte 8039

Im üblichen Programmmodell gibt es drei Hauptarten von Zuweisungen:

  • Statisch - meist für globale/statische Variablen - sie werden beim Laden des Programms zugewiesen (normalerweise an zur Kompilierzeit vordefinierten Speicheradressen, je nach Programmlademodell).
  • Heap - dynamische Zuweisung (z. B. malloc oder new), manchmal gibt es mehr als einen "Speicherpool", aus dem die Zuweisung erfolgt
  • Stack - hauptsächlich für lokale Variablen und Funktionsparameter

Die beiden letzten Typen sind diejenigen, die eine Art von dynamischer Zuweisung erlauben (die auf sehr unterschiedliche Weise implementiert und verwendet wird), und sie werden normalerweise entweder aus verschiedenen Bereichen zugewiesen (was, insbesondere wenn virtueller Speicher unterstützt wird, sehr unterschiedliche Adressen bedeuten kann) oder von verschiedenen Enden desselben Bereichs (wo die Zuweisung beider Arten von Speicher zur Mitte hin fortschreitet).

In Ihrem Fall handelt es sich lediglich um unterschiedliche Speicherbereiche (die Heap-Adresse sollte wahrscheinlich 0x09c4b008 lauten, aber die 0 geht in der Ausgabe verloren).

1voto

Soren Punkte 14074

Das malloc befindet sich auf dem Heap, einem anderen Speicherbereich als dem Stack.

Le anderes Format ist kein Unterschied im Format, sondern einfach nur eine Tatsache, wo im Prozessraum der Speicher vorhanden ist, was teilweise auf eine Entscheidung des Compilers und des Betriebssystems bei der Zuweisung des Heap-Speicherplatzes für malloc zurückzuführen ist.

Siehe auch diese Frage die viel mehr Details enthalten.

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