Ich lerne Speicherverwaltung von c-Programm. Ich bin zu einem guten Zweifel gekommen. (Ubuntu OS)malloc() | Unterschied in der Speicheradresslänge von Stapel- und Heapspeicherorten | C Programmierung
Mein Zweifel:
Ich wollte Adressen von Daten kennen, die in Stapel und innerhalb Haufen liegen beide. Aber als ich versuchte, diese Adressen zu drucken, habe ich festgestellt, dass die Länge der Adressen unterschiedlich ist! Frage ist, warum es Stack-Adresse mit mehr Länge als Heap-Adresse anzeigt?
Was ich weiß:
- Stapelspeicher pro Prozess festgelegt ist und weniger als Heap-Speicher.
- malloc() Speicher zuweisen auf Heap
- lokale Variable geht auf Stapel
ich meine Demo-Code setzen hier so, dass Sie meine Zweifel gut beantworten kann.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr; // goes on stack
ptr = (int *)malloc(sizeof(int));
*ptr = 10; // 10 is stored on heap
printf("%p : heap address\n",ptr);
printf("%p: stack address\n",&ptr);
return 0;
}
Ausgang: Ich habe folgende Ausgabe in meinem Terminal
0x1ea2010 : heap address
0x7ffda62cb3c0: stack address
So, jetzt können Sie verstehen, was ich zu fragen. Warum hat die Stapeladresse mehr Länge als der Heap? Heap ist ein großer Speicherpool, also sollte es offensichtlich mehr Länge haben.
Wenn Stack- und Heap-Zuweisung im selben Speicherblock erfolgt (wie bei modernen OS..Ich habe das irgendwo gelesen), so sollte es auch gleiche Länge haben.
Okay. Bitte helfen Sie mir, meine Gedächtniskonzepte klar zu machen.
Hinweis: Wenn meine Zweifel sehr einfach oder albern sind, dann lass mich bitte wissen, wie die Speicherzuweisung in meinem Demo-Code und Magie hinter verschiedenen Adresslängen erfolgt.
Danke für das Lesen solcher Post. Glückliche Antwort!
Dies sind nur die virtuellen Adressen, die Sie ausdrucken. Die tatsächliche physikalische Adresse des Speichers kann aufgrund der dynamischen Verknüpfung nicht ermittelt werden. Jemand korrigiert mich bitte, wenn ich falsch liege. –
Aus dem C-Standard über den Spezifizierer "% p" für den Konvertierungstyp: "Der Wert des Zeigers wird in eine Folge von Druckzeichen umgewandelt, ** in einer ** von der Implementierung definierten ** Art.". Und Sie sollten zwischen dieser Ausgabe und der internen Darstellung unterscheiden. Bitte geben Sie einen Verweis auf den Standard an, der erfordert, dass Stack-Adressen nicht größer als Heap-Adressen sein dürfen (oder es besteht eine Notwendigkeit für einen Stack oder einen Heap). – Olaf
"Wenn Stapel- und Heap-Zuweisung im selben Speicherblock erfolgt (wie bei modernen OS .. Ich habe das irgendwo gelesen)" - glaube nicht alles, was einige obskure Seiten schreiben.Das macht keinen Sinn. Sie sollten den Autor um eine Klarstellung bitten. – Olaf