C++中堆栈的地址

11 浏览
0 Comments

C++中堆栈的地址

更正:

我在指针地址和指针所指向的地址的概念上搞混了,所以下面的代码已经修改了。现在它打印出了我想要的结果,变量 a、c、i、j、k、p 在堆栈上,变量 b、d 在堆上。静态和全局变量在另一个段中。非常感谢大家!


嗯,我知道这两个概念已经被深入讨论了...但我还是对下面的代码有问题:

#include 
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,所有其他变量的地址似乎都在一起。 (注意:代码和结果已经被修改,不对应这里所说的内容。)

我搜索了很多有关堆栈和堆的资料。常识是,如果通过“new”创建对象,则它在堆上。而本地变量(如上面示例中的 j 和 k)则在堆栈上。但在我的例子中似乎不是这种情况。这取决于不同的编译器,或者我的理解是错误的吗?

非常感谢大家。

admin 更改状态以发布 2023年5月23日
0
0 Comments

你的理解是正确的。

  • 局部变量分配在栈上。
  • 动态分配的对象分配在堆上。

虽然在你的示例中,你一直在获取局部变量的地址。
例如:打印出d而不是d的地址。因为d是局部变量(所以地址与c类似),但它是一个指向在堆上动态分配的对象的指针变量。

编译器如何实现堆栈会有所不同。

在现代操作系统中,堆栈甚至可能共享同一区域(即可以通过在堆中分配块来实现堆栈)。

0
0 Comments

你的理解有误。例如,b是一个指针——如果你想要打印出new创建的对象的地址,你需要打印出b,而不是&bb是一个局部变量,所以它本身(位于&b处)在堆栈上。

对于你的例子,Nlm可能位于你的可执行文件的数据段中。正如你所看到的,它们有着相似的地址。你打印出的其它所有变量都在堆栈上——它们的地址也同样相似。其中一些是指向从堆中分配的对象的指针,但是你打印出来的内容并没有显示出来。

0