請閱讀以下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'使用相同的來源。 –