一、棧區(qū)
又稱 堆棧 ,由編譯器自動分配釋放,是用戶存放程序臨時創(chuàng)建的局部變量,也就是說我們函數(shù)括弧“{}” 中定義的變量(但不包括 static 聲明的變量, static 意味著在數(shù)據(jù)段中存放變量)。除此以外, 在函數(shù)被調(diào)用時,其參數(shù)也會被壓入發(fā)起調(diào)用的進程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值 也會被存放回棧中。由于 棧的后進先出特點,所以 棧 特別方便用來保存/恢復調(diào)用現(xiàn)場。從這個意義上講,我們可以把 堆棧 看成一個寄存、交換臨時數(shù)據(jù)的內(nèi)存區(qū)。
棧 是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存區(qū)域
二、堆區(qū)
由程序員分配釋放,分配方式類似于鏈表,是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。用于存放進程運行中被動態(tài)分配的內(nèi)存段,堆區(qū)的大小并不固定,可動態(tài)擴張或縮減。當進程調(diào)用 alloc 等函數(shù)分配內(nèi)存時,新分配的內(nèi)存就被動態(tài)添加到堆上(堆被擴張);當利用 realse 釋放內(nèi)存時,被釋放的內(nèi)存從堆中被剔除(堆被縮減)。如果應用程序沒有釋放掉,操作系統(tǒng)會自動回收。變量通過 new、alloc、malloc、realloc 分配的內(nèi)存塊就存放在堆區(qū)。
三、全局/靜態(tài)區(qū)
全局/靜態(tài)區(qū) 是存放全局變量和靜態(tài)變量的。
已初始化的全局變量和靜態(tài)變量存放在一塊區(qū)域。
未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域。
由 static 修飾的變量會成為靜態(tài)變量,該變量的內(nèi)存由全局/靜態(tài)區(qū)在編譯階段完成分配,且僅分配一次。
static 可以修飾局部變量也可以修飾全局變量。
全局/靜態(tài)區(qū) 的內(nèi)存在編譯階段完成分配,程序運行時會一直存在內(nèi)存中,只有當程序結(jié)束后才會由操作系統(tǒng)釋放。
四、常量區(qū)
常量區(qū) 是一塊比較特殊的存儲區(qū),常量區(qū)里面存放的是常量,常量字符串就存放在常量區(qū)。
常量區(qū) 的內(nèi)存在編譯階段完成分配,程序運行時會一直存在內(nèi)存中,只有當程序結(jié)束后才會由操作系統(tǒng)釋放。
五、代碼區(qū)
代碼區(qū) 是用來存放可執(zhí)行文件的操作指令(存放函數(shù)的二進制代碼),其實就是存放程序的所有代碼。代碼區(qū) 需要防止在運行時被非法修改,所以只準許讀取操作,而不允許寫入(修改)操作——它是不可寫的。