关于C++中地址空间的问题

Joh*_*ang 2 c++

请阅读以下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;
}
Run Code Online (Sandbox Code Playgroud)

结果:

8
0x1000010e4
0x7fff5fbff66c
0x100100080
1
Run Code Online (Sandbox Code Playgroud)

Cub*_*bbi 8

只有操作系统可以告诉您哪些部分在地址空间的哪些部分.如果您使用的是Linux,请在程序中输出以下内容/proc/self/maps:

我已经添加

std::ifstream maps("/proc/self/maps");
std::cout << maps.rdbuf();
Run Code Online (Sandbox Code Playgroud)

在你的程序结束时,它打印:

8
0x6021c0
0x7fffe07f60bc
0x603010
1
...
00601000-00602000 r--p 00001000 09:01 9175691   /home/cubbi/test
                  ^ -- read-only static data
00602000-00603000 rw-p 00002000 09:01 9175691  /home/cubbi/test
                  ^^ -- writeable static data
00603000-00624000 rw-p 00000000 00:00 0         [heap]
...
7fffe07d7000-7fffe07f9000 rw-p 00000000 00:00 0  [stack]
Run Code Online (Sandbox Code Playgroud)

至于打印a的地址,volatile int没有标准operator<<采用指针到易失性T,但是有一个采用bool,并且任何指针都可以隐式转换为void*,然后可以转换为bool.要打印所需的地址,请将该行更改为

cout << const_cast<int*>(&l) << endl;
Run Code Online (Sandbox Code Playgroud)