先看下如下代碼
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); //堆
}
再看看下面的圖
棧區(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)過定義初始化過的變量脱茉,就屬于該段剪芥;例如下面代碼中的a,指針p以及b三個(gè)變量:
int a = 2;
int *p = &a;
int main ()
{
static int b = 1;
...
...
return 0;
}
.bss段
一些全局或者靜態(tài)的琴许,且未經(jīng)過初始化的變量税肪,屬于.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ū)废亭。