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

全國咨詢/投訴熱線:400-618-4000

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

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

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