gpt4 book ai didi

c++ - C++中栈和堆的地址

转载 作者:可可西里 更新时间:2023-11-01 17:06:10 24 4
gpt4 key购买 nike

更正:

我搞错了指针地址和指针指向的地址的概念,所以修改了下面的代码。现在它打印出我想要的东西,变量 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,其他所有变量的地址似乎都在一起。 (注:代码和结果已经修改,与这里所说的不对应。)

我已经搜索了很多关于堆栈和堆的信息。常识是,如果一个对象是由“new”创建的,那么它就在堆上。局部变量(如上例中的 j 和 k)在堆栈上。但在我的例子中似乎并非如此。是依赖不同的编译器,还是我的理解有误?

非常感谢大家。

最佳答案

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

对于您的示例,Nlm 大概在您的可执行文件数据部分中的某处。如您所见,它们具有相似的地址。您正在打印的每个其他变量都在堆栈上——它们的地址同样彼此相似。其中一些是指向从堆中分配的对象的指针,但您的打印输出都不会显示这一点。

关于c++ - C++中栈和堆的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3526005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com