用來存放可執行文件中已初始化的全局變量,換句話說就是存放程序靜態分配的變量和全局變量;操作系統
代碼段是用來存放可執行文件的操做指令,也就是說它是可執行程序在內存中的鏡像。代碼段須要防止在運行時被非法修改,因此只容許讀取操做,而不容許寫入(修改)操做-----它是不可寫的;進程
包含了程序中未初始化的全局變量,在內存中bss段所有置零;內存
堆是用於存放進程運行中被動態分配的內存段,它的大小並不固定,能夠動態擴展或者所建。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴展);當利用free等函數釋放內存時,被釋放的內存從堆中被提出(堆被縮減);it
棧是用戶存放程序臨時建立的局部變量,也就是說咱們函數括弧中定義的變量(可是並不包括static聲明的變量,static意味着在數據段中存放變量).除此之外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,而且待到調用結束後,函數的返回值也會被存放回棧中。因爲棧的先進先出的特色,因此棧特別方便用來保存/回覆調用現場。從這個意義上講,咱們能夠把棧當作一個寄存,交換臨時數據的內存區。它是由操做系統分配的,內存的申請與回收都由OS管理。class