教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

c/c++培訓(xùn)C語(yǔ)言核心知識(shí)總結(jié)(七)

更新時(shí)間:2016年10月21日16時(shí)37分 來(lái)源:傳智播客C++培訓(xùn)學(xué)院 瀏覽次數(shù):

七、內(nèi)存四區(qū)
 
stack: 棧區(qū),是由編譯器自動(dòng)分配和釋放,主要是存放函數(shù)參數(shù)的值,局部變量的值。
 
heap:堆區(qū),是由程序員自己申請(qǐng)分配和釋放,需要 malloc(); calloc(); realloc();函數(shù)來(lái)申請(qǐng),用free()函數(shù)來(lái)釋放
如果不釋放,可能出現(xiàn)野指針。
 
**函數(shù)不能返回指向棧區(qū)的指針,但是可以返回指向堆區(qū)的指針。**
 
data:數(shù)據(jù)區(qū) -> 靜態(tài)(全局)區(qū) 和 常量區(qū)
靜態(tài)(全局)區(qū):標(biāo)有 static 關(guān)鍵字,保存了靜態(tài)變量和全局變量
1. 初始化的全局變量和初始化的靜態(tài)變量,在一塊區(qū)域;
(data段存放在編譯階段(而非運(yùn)行時(shí))就能確定的數(shù)據(jù),可讀可寫(xiě)。
也就是通常所說(shuō)的靜態(tài)存儲(chǔ)區(qū),賦了初值的全局變量和賦初值的靜態(tài)變量存放在這個(gè)區(qū)域,常量也存放在這個(gè)區(qū)域;)
 
2. 未初始化的全局變量和為初始化的靜態(tài)變量,在一塊區(qū)域;
(BSS段通常是指用來(lái)存放程序中未初始化的全局變量和靜態(tài)變量的一塊內(nèi)存區(qū)域。特點(diǎn)是可讀寫(xiě)的,在程序執(zhí)行之前BSS段會(huì)自動(dòng)清0)
 
3. 靜態(tài)變量的生命周期是整個(gè)源程序,而且只能被初始化一次,之后的初始化會(huì)被忽略。
(如果不初始化,數(shù)值數(shù)據(jù)將被默認(rèn)初始化為 0, 字符型數(shù)據(jù)默認(rèn)初始化為 NULL )。
 
常量區(qū):這里的數(shù)據(jù)是只讀的,常量和字符串都保存在這里。(不包括字符數(shù)組類(lèi)型的字符串 -> 棧區(qū))
除了第一次初始化外,常量區(qū)的數(shù)據(jù)在程序執(zhí)行的時(shí)候不允許再次賦值。
 
整個(gè)數(shù)據(jù)區(qū)的數(shù)組,在程序結(jié)束后由系統(tǒng)統(tǒng)一銷(xiāo)毀。
 
code:代碼區(qū),用于存放編譯后的可執(zhí)行代碼,二進(jìn)制碼,機(jī)器碼。
 
 
 
/*
BSS段:BSS段(bss segment)通常是指用來(lái)存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域。
 
                 BSS是英文Block Started by Symbol的簡(jiǎn)稱(chēng)。BSS段屬于靜態(tài)內(nèi)存分配。
 
 
 
數(shù)據(jù)段:數(shù)據(jù)段(data segment)通常是指用來(lái)存放程序中已初始化的全局變量的一塊內(nèi)存區(qū)域。
 
                 數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配。
 
 
 
代碼段:代碼段(code segment/text segment)通常是指用來(lái)存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。
 
                 這部分區(qū)域的大小在程序運(yùn)行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于只讀, 某些架構(gòu)也允許代碼段為
 
                 可寫(xiě),即允許修改程序。在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量等。
 
 
 
堆(heap):堆是用于存放進(jìn)程運(yùn)行中被動(dòng)態(tài)分配的內(nèi)存段,它的大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。當(dāng)
 
                           進(jìn)程調(diào)用malloc等函數(shù)分配內(nèi)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張);當(dāng)利用
 
                           free等函數(shù)釋放內(nèi)存時(shí),被釋放的內(nèi)存從堆中被剔除(堆被縮減)
 
 
 
棧(stack):棧又稱(chēng)堆棧, 是用戶(hù)存放程序臨時(shí)創(chuàng)建的局部變量,也就是說(shuō)我們函數(shù)括弧“{}”中定義的變量
 
                     (但不包括static聲明的變量,static意味著在數(shù)據(jù)段中存放變量)。除此以外,在函數(shù)被調(diào)用時(shí),
 
                     其參數(shù)也會(huì)被壓入發(fā)起調(diào)用的進(jìn)程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值也會(huì)被存放回棧中。
 
                     由于棧的先進(jìn)先出特點(diǎn),所以棧特別方便用來(lái)保存/恢復(fù)調(diào)用現(xiàn)場(chǎng)。從這個(gè)意義上講,我們可以把
 
                     堆??闯梢粋€(gè)寄存、交換臨時(shí)數(shù)據(jù)的內(nèi)存區(qū)。
*/
 
 
 
 
static 關(guān)鍵字詳解:
static 在C語(yǔ)言里面既可以修飾變量,也可以修飾函數(shù)。
 
static 變量:
1. 靜態(tài)局部變量:在函數(shù)中定義的,生命周期是整個(gè)源程序,但是作用域和自動(dòng)變量沒(méi)區(qū)別。
都是只能在定義這個(gè)變量的函數(shù)范圍內(nèi)使用,而且只能在第一次進(jìn)入這個(gè)函數(shù)時(shí)候被初始化,
之后的初始化會(huì)跳過(guò),并保留原來(lái)的值。退出這個(gè)函數(shù)后,盡管這個(gè)變量還在,但是已經(jīng)不能使用了。
 
2. 靜態(tài)全局變量:全局變量本身就是靜態(tài)存儲(chǔ)的,但是靜態(tài)全局變量和非靜態(tài)全局變量又有區(qū)別:
1) 全局變量:變量的作用域是整個(gè)源程序,其他源文件也可以使用,生命周期整個(gè)源程序。
2) 靜態(tài)全局變量:變量的作用域范圍被限制在當(dāng)前文件內(nèi),其他源文件不可使用,生命周期整個(gè)源程序。
 
static 函數(shù)(內(nèi)部函數(shù)):
只能被當(dāng)前文件內(nèi)的其他函數(shù)調(diào)用,不能被其他文件內(nèi)的函數(shù)調(diào)用,主要是區(qū)別非靜態(tài)函數(shù)(外部函數(shù))
 
總結(jié):
作用域:變量或函數(shù)在運(yùn)行時(shí)候的 有效作用范圍 。
生命周期:變量或函數(shù)在運(yùn)行時(shí)候的 沒(méi)被銷(xiāo)毀回收 的存活時(shí)間。
 
      作用域    生命周期
 
局部變量 所在代碼塊內(nèi)   所在函數(shù)結(jié)束
 
全局變量 所有文件內(nèi)   程序執(zhí)行結(jié)束
 
靜態(tài)局部變量 所在代碼塊內(nèi)     程序執(zhí)行結(jié)束
 
靜態(tài)全局變量 當(dāng)前文件內(nèi)   程序執(zhí)行結(jié)束
 
普通函數(shù) 所有文件內(nèi)   程序執(zhí)行結(jié)束
 
靜態(tài)函數(shù) 當(dāng)前文件內(nèi)   程序執(zhí)行結(jié)束
本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://www.xamj520.com/c/ 
0 分享到:
和我們?cè)诰€(xiàn)交談!