windows和linux內存存儲結構

windows

一個由C/C++編譯的程序佔用的內存分爲以下幾個部分 
  1、棧區(stack)— 由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。 
  2、堆區(heap)— 一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。 
  3、全局區(靜態區)(static)— 全局變量靜態變量的存儲是放在一塊的,初始化的全局變量靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束後由系統釋放。 
  4、文字常量區 — 常量字符串就是放在這裏的。程序結束後由系統釋放 
  5、程序代碼區— 存放函數體的二進制代碼

 

Linux

局部變量可以用類型相符的任意表達式來初始化,而全局變量只能用常量表達式初始化,例如:

例如,全局變量pi這樣初始化是合法的:

double pi = 3.14 + 0.0016;

但這樣初始化是不合法的:

double pi = acos(-1.0); 

局部變量這樣初始化卻是可以的。

 程序開始運行時要用適當的值來初始化全局變量,所以初始值必須保存在編譯生成的可執行文件中,因此初始值在編譯時就要計算出來,然而上面第二種初始化的值必須在程序運行時調用acos函數才能得到,所以不能用來初始化全局變量。請注意區分編譯時和運行時這兩個概念。爲了簡化編譯器的C語言從語法上規定全局變量只能用常量表達式來初始化。

如果全局變量在定義時不初始化則初始值是0,如果局部變量在定義時不初始化則初始值是不確定的。

(高內存地址)

空洞

BSS段(未初始化數據段,用0填充)

.data數據段

.text文本段(低內存地址)

 

 

關於不同類型的變量在內存中的位置:

1.     全局變量 已初始化 位於.data數據段;未初始化 則位於.bss未初始化數據段。

2.     靜態(static)全局變量也在.data數據段。

3.     局部變量 在棧上。靜態局部變量,並不是在調用函數時分配,在函數返回時釋放,而是像全局變量一樣靜態分配,在.data數據段,但它的作用域只在函數中起作用。

4.     const修飾的全局變量在.rodata只讀數據段(const變量在定義時必須初始化,所以沒有所謂的未初始化const變量),只讀數據段在和.text同一個Segment.

 


發佈了28 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章