(1
)棧(stack
):由編譯器自動分配釋放,存放
函式的引數值、區域性變數的值、返回位址等,其操作方式類似於資料結果中的棧。
棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「
」中定義的變數(但不包括static
宣告的變數,
static
意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存
/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。
(2)堆(heap
):一般由
程式設計師動態分配(呼叫malloc
函式)和釋放(呼叫
free
函式),若程式設計師不釋放,程式結束時可能由作業系統**。
堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc
等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用
free
等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)。
(3)資料段(
data
):存放的是
全域性變數、靜態變數、常數。根據存放的資料,資料段又可以分為普通資料段(包括可讀可寫/
唯讀資料段,存放靜態初始化的全域性變數或常量)、
bss資料段(存放未初始化的全域性變數)。
在採用段式記憶體管理的架構中,bss
段(bss segment
)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。
bss是英文
block started by symbol
的簡稱。
bss段屬於靜態記憶體分配。 程式結束後由系統釋放
(4)文字常量區
:—常量字串就是放在這裡的
,程式結束後由系統釋放
(5)**段(
code
):用於存放程式**。**段(
code segment/text segment
)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀
, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。
記憶體分布示意圖
int a = 0;
//全域性初始化區
char *p1;
//全域性未初始化區
main()
C語言中的變數的分類
c語言中的變數,有區域性變數和全域性變數。一 區域性變數 區域性變數又稱內部變數,由某物件或某個函式所建立的變數通常都是區域性變數,只能被內部引用,而無法被其它物件或函式引用。二 全域性變數 全域性變數即外部變數,建立在函式的外部的變數,可以建立在程式中的任何位置。全部變數是可以被本程式中的任何函式...
C語言中的記憶體對齊
這階段一直想寫一篇部落格,其實有好多東西,先寫一下c語言中的記憶體對齊吧。大家都知道,在c語言中定義乙個變數,char是占用乙個位元組的,int占用四個位元組,float占用四個位元組,double占用八個位元組,short占用兩個位元組,long int占用四個位元組,long long神馬的是6...
C語言中的記憶體管理
先說一下c語言中的記憶體管理。1.動態記憶體分配 原因 程式執行過程中,很有可能需要一些額外的記憶體空間。動態記憶體從 來,還給誰?這塊是記憶體是系統專門預留出來的,給程式動態的分配和動態的歸還的。當free函式的引數為空的時候,那麼我們的free什麼事都不做了。clloc和realloc的用法見截...