C語言中的記憶體分類

2021-06-25 18:29:50 字數 1447 閱讀 2849

(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的用法見截...