一個由C/C++編譯的程序佔用的內存佈局爲(低地址->高地址):
1、程序代碼區 存放函數體的二進制代碼。
2、文字常量區 常量字符串就是放在這裏的。 程序結束後由系統釋放
3、全局區(靜態區)(static)
全局變量和靜態變量的存儲是放在一塊的。
初始化的全局變量和靜態變量
未初始化的全局變量和未初始化的靜態變量(BSS段,這一名稱來源於早期彙編程序的一個操作符,意思是“block started by symbol(由符號開始的塊)”,未初始化的全局變量和靜態變量存放在這裏。)
程序結束後有系統釋放。
4、堆區(heap) 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。
5、棧區(stack) 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。棧的分分配根據地址由高到低分配,但是數組內部的地址小下標地址低於大下標地址,所以在如下程序時:
int a;
int b[3];//當程序邊界沒有處理好,取b[3]的值時候,有可能取到的是a的值。
6、命令行參數和環境變量
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
union的存放順序是所有成員都從低地址開始存放。大尾端時CPU將數據的高位放在低地址,小尾端時CPU將數據的低位放在低地址。例如,32bit寬的數0x12345678在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)爲:
內存地址 0x4000 0x4001 0x4002 0x4003
存放內容 0x78 0x56 0x34 0x12
而在Big-endian模式CPU內存中的存放方式則爲:
內存地址 0x4000 0x4001 0x4002 0x4003
存放內容 0x12 0x34 0x56 0x78
因此下列程序
int checkCPU()
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
}
在 小尾端時返回1,大尾端時返回0。