校正:地址
我弄亂了與指針地址和地址指針指向的概念,所以下面的代碼已被修改。現在它打印出我想要的,變量a,c,i,j,k,p在堆棧上,而變量b,d在堆上。靜態和全局變量位於另一個段上。非常感謝你們所有人!
嗯,我知道這兩個概念進行了深入的討論......不過我還是有以下代碼的問題:
#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;
}
我的結果是:
&a: 0x28ff20
&b: 0x7c2990
&i: 0x28ff1c
&N: 0x443000
&c: 0x28fef3
&d: 0x7c0f00
&j: 0x28feec
&k: 0x28fee8
&l: 0x443004
&m: 0x443008
&p: 0x28ff00
這非常有趣,除了全局變量N和函數f中的兩個靜態變量l和m,所有其他變量的地址似乎都在一起。 (注意:代碼和結果已被修改,與此處所述內容不一致)。
我已經搜索了很多關於堆棧和堆的內容。常識是,如果一個對象是由「新」創建的,那麼它就在堆上。局部變量(例如上面示例中的j和k)在堆棧中。但在我的例子中似乎並非如此。它依賴於不同的編譯器,還是我的理解錯誤?
非常感謝大家。
我不明白你的問題,你爲什麼認爲一個變量是基於你顯示的地址在堆棧或堆上。 – 2010-08-19 20:40:51
這真的沒有意義。你不能對你的內存在哪裏進行任何推斷 – Falmarri 2010-08-19 20:41:40
[C++中正確的堆棧和堆使用情況?](http://stackoverflow.com/questions/599308/proper-stack-and-heap-usage -in-c) – 2010-08-19 20:42:51