堆栈和堆在C ++中的地址

更正:

我搞砸了指针地址的概念和指针指向的地址,所以下面的代码已被修改。 现在它打印出我想要的,变量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)在堆栈中。 但在我的例子中似乎并非如此。 它依赖于不同的编译器,还是我的理解错误?

非常感谢你们所有人。


你的理解是错误的。 例如, b是一个指针 - 如果你想要new的对象的地址,你需要输出b ,而不是&bb是一个局部变量,所以它本身(在&b处找到)在堆栈中。

举个例子, Nlm大概是在你的可执行文件的数据部分。 正如你所看到的,他们有类似的地址。 您打印出的其他所有变量都在堆栈中 - 它们的地址同样相似。 其中一些是指向从堆中分配的对象的指针,但是没有任何打印输出会显示该对象。


你的理解是正确的。

  • 局部变量分配在堆栈上。
  • 动态分配的对象分配在堆上。
  • 尽管在你的例子中你一直在使用局部变量的地址。
    例如:打印出d的不是地址d 。 由于d是一个局部变量(因此地址与c类似),但是它是一个指向动态分配对象(that is on the heap)对象)的指针变量。

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

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


    在你的例子中唯一不是'一起'的是lmN 他们是两个静态和一个全局,因此他们没有被确切地分配到栈上。 他们不是从堆中获取的,最有可能的是,它们来自模块的.data段。 堆中唯一的地址应该是地址b指向的地址,但是您打印的是b本身的地址,而不是它指向的地址。

    链接地址: http://www.djcxy.com/p/82469.html

    上一篇: Address of Stack and Heap in C++

    下一篇: How to console.log an error with stack trace in node.js?