內(nèi)存中的分區(qū)

先看下如下代碼

int a = 0; //全局初始化區(qū)
char *p1; //全局未初始化區(qū)
main()
{ 
    int b; //棧
    char s[] = "abc"; //棧
    char *p2; //棧
    char *p3 = "123456"; //123456\0在常量區(qū),p3在棧上
    static int c =0; //全局(靜態(tài))初始化區(qū)
    p1 = (char *)malloc(10); //堆
    p2 = (char *)malloc(20);  //堆
}

再看看下面的圖

1609713-eaa6e0729938352f.jpg

棧區(qū)

由操作系統(tǒng)自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。

堆區(qū)

一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)回收。平時(shí)iOS中new對(duì)象都是創(chuàng)建在堆上的。

可讀可寫區(qū)(.data .bss)

可讀可寫區(qū)(全局區(qū))(靜態(tài)區(qū))其實(shí)都是一個(gè)意思,存放全局變量和靜態(tài)變量的。

.data段

一些全局或者靜態(tài)的,且經(jīng)過(guò)定義初始化過(guò)的變量,就屬于該段;例如下面代碼中的a,指針p以及b三個(gè)變量:

int a = 2;
int *p = &a;

int main () 
{
    static int b = 1;
...
...
    return 0;
}
.bss段

一些全局或者靜態(tài)的,且未經(jīng)過(guò)初始化的變量,屬于.bss段。例如上文中.data段段的三個(gè)變量,如果不進(jìn)行初始化,就會(huì)存儲(chǔ)在本段中.

只讀區(qū)(常量區(qū))

.text段

真正組成程序的機(jī)器指令則存放在.text段中。一般情況下,在.text段中不進(jìn)行數(shù)據(jù)項(xiàng)的定義。.text段包含名為標(biāo)號(hào)的符號(hào),這些符號(hào)用于標(biāo)識(shí)跳轉(zhuǎn)和調(diào)用程序代碼位置。

常量

常量如const修飾的常量,字符串常量,都放在這個(gè)區(qū)。

理解了內(nèi)存的分區(qū)之后,在我們后續(xù)的內(nèi)存管理上,會(huì)理解的更深刻一些。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容