C程序中內存佈局&Union大小尾端

轉載地址

一個由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。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章