请阅读以下C++代码和结果。根据某些wiki页面,静态,自动和动态分配的变量分配在不同的地址空间中,即数据段,堆栈和堆。但是,在我看来,静态和动态变量的地址大致在同一个地方。为什么?我如何知道静态变量确实在数据段中,而不是在堆中?关于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分配的对象,那可能是因为加载器或程序自己的init代码(在调用'main'之前)为它们分配了一块内存,并且该块最终来了来自与'new'使用相同的来源。 –