Adresse von Stack und Heap in C++
Korrektur:
Ich Durcheinander mit dem Konzept der pointer-Adresse und die Adresse, die der Zeiger zeigt, also der folgende code wurde geändert. Und jetzt es druckt, was ich will, die variable a, c, i, j, k, p sind auf dem stack, und die variable b,d liegen auf dem heap. Statische und Globale Variablen werden auf einem anderen segment. Vielen Dank für Euch alle!
Gut, ich weiß, dass diese beiden Konzepte sind tief besprochen...aber ich habe noch Fragen für den folgenden code:
#include <iostream>
using namespace std;
class A {
};
int N = 10;
void f(int p) {
int j = 1;
float k = 2.0;
A c;
A* d = new A();
static int l = 23;
static int m = 24;
cout << "&c: " << &c << endl;
cout << "&d: " << d << endl;
cout << "&j: " << &j << endl;
cout << "&k: " << &k << endl;
cout << "&l: " << &l << endl;
cout << "&m: " << &m << endl;
cout << "&p: " << &p << endl;
}
int main() {
int i = 0;
A* a;
A* b = new A();
cout << "&a: " << &a << endl;
cout << "&b: " << b << endl;
cout << "&i: " << &i << endl;
cout << "&N: " << &N << endl;
f(10);
return 0;
}
Mein Ergebnis ist:
&a: 0x28ff20
&b: 0x7c2990
&i: 0x28ff1c
&N: 0x443000
&c: 0x28fef3
&d: 0x7c0f00
&j: 0x28feec
&k: 0x28fee8
&l: 0x443004
&m: 0x443008
&p: 0x28ff00
Dies ist ziemlich interessant, denn außer die Globale variable N und zwei statische Variablen in der Funktion f, die l und m, die Adressen aller anderen Variablen scheinen, zusammen zu sein. (Hinweis: Der code und die Ergebnisse wurden geändert und entsprechen nicht dem, was gesagt wird hier.)
Ich gesucht habe eine Menge über die stack und heap. Der common sense ist, dass, wenn ein Objekt erstellt wird, indem "new", dann ist es auf dem heap. Und lokale Variablen (wie j und k in dem obigen Beispiel) werden auf den stack. Aber es scheint nicht der Fall zu sein in meinem Beispiel. Kommt es auf verschiedenen Compilern, oder mein Verständnis falsch ist?
Vielen Dank für Euch alle.
- Ich verstehe nicht, Ihre Frage, warum Sie denken, dass eine variable auf dem stack oder heap basiert auf den Adressen, die Sie gezeigt haben.
- Das ist wirklich sinnlos. Sie können nicht machen, jede Art von Rückschluss darüber, wo Sie Ihr Gedächtnis ist
- mögliche Duplikate von die Richtige stack-und heap-Verwendung in C++?
- Ich weiß nicht, wie die vorgeschlagenen duplizieren, aber am voting für die NaRQ da wurde der Beitrag basiert auf einem Missverständnis über die OP, und jetzt, dass dies gelöscht wurde, es ist keine Frage mehr. @Zhongxia: Wenn Sie noch interessiert sind, was hier vorgeht, möchten Sie vielleicht zu Lesen, auf das "data segment".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Verständnis ist falsch. Zum Beispiel
b
ist ein Zeiger - wenn Sie möchten, dass die Adresse des Objekts erstellt vonnew
müssen Sie ausdruckenb
, nicht&b
.b
ist eine lokale variable, so dass es sich (gefunden bei&b
) wird auf den stack.Zu deinem Beispiel
N
,l
, undm
sind vermutlich irgendwo in der ausführbaren Datei der Daten-Abschnitt. Wie Sie sehen können, Sie haben ähnliche Adressen. Jede andere variable, die Sie ausgedruckt auf dem Stapel - Ihre Adressen sind ebenfalls einander ähnlich. Einige von Ihnen sind Zeiger zeigen auf Objekte zugeordnet, die aus den Haufen, aber keiner Ihrer Ausdrucke zeigen würde, dass.Ihr Verständnis ist korrekt.
Obwohl Sie unter der Adresse der lokalen Variablen konsequent in deinem Beispiel.
Beispiel: drucken Sie
d
nicht die Adresse desd
. Alsd
ist eine lokale variable (also die Adresse ist ähnlichc
), aber es ist eine Zeiger-variable, die auf einen dynamisch reservierten Objekts(that is on the heap)
.Wie der compiler setzt die stack-und heap-allerdings variieren.
In moderne OS den stack-und heap-vielleicht sogar den gleichen Bereich teilen (dh Sie können implementieren Sie den stack durch Zuweisung von chunks im heap).
Wenn Sie möchten, drucken Sie sich die Adresse von was auch immer
d
Punkte (in diesem Fall Punkte, um ein Objekt auf dem heap), tunWird, drucken Sie den Wert des Zeigers, und der Wert eines Zeigers ist die Adresse des Objekts verweist.
Ihren code hatte
Dieser druckt die Adresse von
d
, wie Sie definiertd
im inneren main, es werden auf dem Stapel, die Sie drucken wollen, die Adresse des Zeigers. Da ist der Zeiger selbst, und das Objekt, das es Punkte auf, Sie sind 2 seperate Dinge, mit separaten Adressen.Die einzigen sind, die nicht 'zusammen' in deinem Beispiel sind
l
,m
undN
. Sie sind zwei statische und eine Globale, daher sind Sie nicht auf dem Stapel reserviert für sicher. Sie sind nicht aus einem heap und auch nicht, wahrscheinlich sind Sie von einem .Daten-segment des Moduls. Der einzige, der aus einem heap sollte die Adresseb
Punkte zu, aber Sie drucken sich die Adresse vonb
selbst, nicht das, was es zeigt.&p
zu 'weit' von&j
) auf einer Plattform wie IA64 mit 'Zusatzspeicher' stack finden Sie unter blogs.msdn.com/b/slavao/archive/2005/03/19/399117.aspxDie Unterscheidung zwischen den beiden Formen, die aus einer reinen C++ - Perspektive, ist nur damit zu tun, wie die Lebensdauer der Objekte verwaltet werden.
Von hier aus, gut zu Lesen
Statische Variablen im Datensegment. Auch mischen Sie die Adresse eines Zeigers und es Wert. Für Beispiel a:
a ist eine lokale variable vom Typ A* auf dem Stapel. &eine gibt auch die Adresse, wo ein actaully resieds (auf dem stack). Der Wert von a ist die Adresse eines heap-Objekt vom Typ A;
Können Sie nicht hängt von verschiedenen Compilern, die Dinge auf die gleiche Weise. Für fast jedes bit der code, den Sie schreiben, den Unterschied zwischen stack und heap sind bedeutungslos. Mach dir keine sorgen.
Kann man nicht sicher davon ausgehen, etwas über die relativen Adressen der Dinge in den stack im Verhältnis zu den auf dem heap noch, für diese Angelegenheit, die relative Adressen jeder Zeiger, die sind nicht alle aus dem gleichen array oder reserviert (via malloc, calloc, etc.) block. Ich bin mir auch nicht sicher, dass die Zeiger sind erforderlich, um rankable.