C++中Stack和Heap的地址

Zho*_*hou 8 c++ heap stack

更正:

我搞砸了指针地址的概念和指针指向的地址,因此修改了以下代码.现在它打印出我想要的东西,变量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;
}
Run Code Online (Sandbox Code Playgroud)

我的结果是:

&a: 0x28ff20
&b: 0x7c2990
&i: 0x28ff1c
&N: 0x443000
&c: 0x28fef3
&d: 0x7c0f00
&j: 0x28feec
&k: 0x28fee8
&l: 0x443004
&m: 0x443008
&p: 0x28ff00
Run Code Online (Sandbox Code Playgroud)

这是非常有趣的,除了全局变量N和函数f中的两个静态变量,它们是l和m,所有其他变量的地址似乎在一起.(注意:代码和结果已被修改,与此处所述内容不对应.)

我搜索了很多关于堆栈和堆的信息.常识是,如果一个对象是由"new"创建的,那么它就在堆上.并且局部变量(例如上面示例中的j和k)在堆栈上.但在我的例子中似乎并非如此.它取决于不同的编译器,还是我的理解错了?

非常感谢你们所有人.

Car*_*rum 15

你的理解是错误的.例如,b是一个指针 - 如果你想要创建的对象的地址new,你需要打印出来b,而不是&b. b是一个局部变量,所以它本身(找到&b)在堆栈上.

对于你的榜样,N,l,和m在你的可执行文件的数据部分大概地方.如您所见,它们具有相似的地址.您正在打印的每个其他变量都在堆栈中 - 它们的地址同样彼此相似.其中一些是指向从堆分配的对象的指针,但没有一个打印输出会显示.