在記憶體中程式分別儲存在如下幾個區域中:
1) **段 或者 正文區(code or text)
但是實質都是一樣的,都是用來存放程式語句進行編譯後,形成機器的**。一般此記憶體區是唯讀的,防止程式意外修改指令。
2) 初始資料段(ro/rw data segment)
這一段其實有兩個段,乙個ro段,乙個data段.
通常是用來存放程式中已初始化的全域性變數的一塊記憶體區域。又分為唯讀和讀寫兩種,此資料段屬於靜態記憶體分配;
就是用於儲存已經被明確初始化(初始化為非0值)的靜態全域性變數,全域性變數,靜態區域性變數.
所有字串常量" "會存在ro段裡面, 全域性變數和靜態變數在data段.
3) 未初始化資料段(bss=block started by symbol)
未初始化讀寫據是在程式中宣告,但是沒有初始化的變數,這些變數在程式執行之前不需要占用儲存器的空間.bss 段也屬於靜態記憶體分配
就是用於儲存未被初始化和初始化為0的靜態的區域性變數,靜態全域性變數,全域性變數。
凡是在bss段儲存的資料,初始化都是為0
(注意:同時有bss和data段的原因是因為bss段裡面所有的資料都是0,所以編譯的時候,磁碟可以不出現bss段,可以節省空間,執行載入在記憶體的時候bss端才會出現)
4) 堆(heap): 用於存放由程式設計師手動申請的變數
堆記憶體只在程式執行時出現,一般由程式設計師手動分配和釋放,一般可以使用malloc()/nalloc() &free() 函式來申請、釋放。在作業系統下,如果程式設計師沒釋放,一般作業系統可以在程式結束後**記憶體
5) 棧(stack):用於儲存非靜態的區域性變數,棧的大小無法更改
存放程式的區域性變數(但不包括 static 宣告的變數,static 意味著在資料段中存放變數)。除此以外,在函式被呼叫時,棧用來傳遞引數和返回值。由於棧的最大特點後進先出,所以棧特別方便用來儲存/恢復呼叫現場。棧的變數如果不初始化,變數的值是乙個隨機數.
(注意核心裡面的棧只有8k,所以核心裡面慎用遞迴演算法,幾次迴圈那麼棧就滿,會宕機)
很多段錯誤(segment false)發生都是因為對這幅圖不理解,所謂的段錯誤就是修改或者訪問無許可權的區域, 段錯誤是邏輯錯誤,不是語法錯誤,可以通過編譯的
#include #include int a2 = 0; //bss段
int a3 = 10; //.data
int a1; //bss段
static int c1 ; //bss段
static int c2 = 0; //bss
static int c3 = 10; //data
int main(int argc, char const *argv)
C記憶體分布
先看一下測試 include include int g val int g ival 5 char g ptr char g iptr hongchunhua static int s val static int s ival 5 int print add int val int main 輸...
C 記憶體分布
在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...
C 記憶體分布
預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中...