【发布时间】:2011-04-01 08:37:13
【问题描述】:
更正:
我把指针地址的概念和指针指向的地址搞混了,所以修改了下面的代码。现在它打印出我想要的内容,变量 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)在堆栈上。但在我的示例中似乎并非如此。是依赖不同的编译器,还是我的理解有误?
非常感谢大家。
【问题讨论】:
-
从您的问题中我不明白为什么您认为根据您显示的地址,一个变量在堆栈或堆上。
-
这真是毫无意义。你无法推断你的记忆在哪里
-
我不喜欢提议的副本,但我投票给 NaRQ,因为该帖子是基于对 OP 的误解,现在已经澄清了,没有问题了。 @Zhongxia:如果您仍然对这里发生的事情感兴趣,您可能需要阅读“数据段”。
标签: c++ heap-memory stack-memory