【发布时间】:2011-11-21 06:21:22
【问题描述】:
请阅读以下 C++ 代码和结果。根据一些维基页面,静态、自动和动态分配的变量被分配在不同的地址空间,即数据段、堆栈和堆。但是,在我看来,静态变量和动态变量的地址大致相同。为什么呢?我怎么知道静态变量真的在数据段中,而不是在堆中?
一个更广泛的问题是在 C++ 中是否有可能知道每个地址空间的范围(或可用大小)?
我还有一个问题是为什么 volatile 变量的地址是 1?
#include <iostream>
using namespace std;
static int i;
int main() {
cout << sizeof(int*) << endl;
int j;
int* k = new int[10];
volatile int l;
cout << &i << endl;
cout << &j << endl;
cout << k << endl;
cout << &l << endl;
delete[] k;
}
结果:
8
0x1000010e4
0x7fff5fbff66c
0x100100080
1
【问题讨论】:
-
每个进程都有一个地址空间。您将部分/段与地址空间混合在一起。
-
那么我的问题就变成了:在 C++ 中我们能知道每个部分(或段)的范围(或大小)是多少吗?
-
如果你的可修改全局变量接近分配给
new的对象,那可能是因为加载器或程序自己的初始化代码(在调用main之前)已经为它们分配了一块内存,并且该块最终与new使用的来源相同。 -
也试试 static const int ci; &ci 可能与 &i 非常不同。
-
@R。 Martinho Fernandes : 这实际上并不能以任何方式保证。在哈佛架构上,您至少有两个(函数指针的一个不同的)。这就是为什么你不能将
void*转换为void(*)()的原因;甚至不能保证它们使用相同数量的位,即两个地址空间甚至不需要相同大小。
标签: c++