局部變量與全局變量區(qū)別,棧、堆和靜態(tài)存儲區(qū)的區(qū)別_第1頁
已閱讀1頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、C變量根據(jù)定義位置的不同,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,全局作用域,局部作用域,語句作用域,類作用域,命名作用域和文件作用域。類作用域,命名作用域和文件作用域。從作用域看:從作用域看:全局變量全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用于所有的源文件。當然,其他不包括全局變量定義的源文件需要用extern關鍵字再次聲明這個全局變量。靜態(tài)局部變量靜態(tài)局部變量具有局部作用域。它

2、只被初始化一次,自從第一次初始化直到程序與你新內(nèi)閣結(jié)束都一直存在,他和全局變量的區(qū)別在于全局變量對所有的函數(shù)都是可見的,而靜態(tài)局部變量只對定義自己的函數(shù)體始終可見。局部變量局部變量也只有局部作用域,他是自動對象,他在程序運行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用結(jié)束后,變量就被撤銷,其所占用的內(nèi)存也被收回。靜態(tài)全局變量靜態(tài)全局變量也具有全局作用域,他與全局變量的區(qū)別在于如果程序包含多個文件的話,他作用于定義它的文件里

3、,不能作用到其他文件里,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同的靜態(tài)全局變量,他們也是不同的變量。從分配內(nèi)存空間看:從分配內(nèi)存空間看:全局變量、靜態(tài)局部變量、靜態(tài)全局變量都在靜態(tài)存儲區(qū)分配空間,而局部變量在棧分配空間。全局變量本身就是靜態(tài)存儲方式,靜態(tài)全局變量當然也是靜態(tài)存儲方式。這兩者在存儲方式上沒有什么不同。區(qū)別在于非靜態(tài)全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非

4、靜態(tài)的全局變量在各個源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在同一源程序的其他源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其他源文件中引起錯誤。1、靜態(tài)變量會被放在程序的靜態(tài)數(shù)據(jù)存儲區(qū)里,這樣可以在下一次調(diào)用的時候還可以保持原來的賦值。這一點是他與堆棧變量和堆變量的區(qū)別2、變量用static告知編譯器,自己僅僅在變量的作用域范圍內(nèi)可

5、見。這一點是他與全局變量的區(qū)別。從以上分析可以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了他的存儲方式,即改變了他的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了他的作用域,限制了他的使用范圍,因此static這個說明符在不同的地方起的作用是不同的。TIPS:1、若全局變量僅在單個文件中訪問,則可以講這個變量修改為靜態(tài)全局變量。2、若全局變量僅在單個函數(shù)中使用,則可以將這個變量修改為該函數(shù)的靜態(tài)局部變量。3、全局變量、靜態(tài)局部變量、靜態(tài)全局變量

6、都存放在靜態(tài)數(shù)據(jù)存儲區(qū)。4、函數(shù)中必須要使用static變量的情況:當某函數(shù)的返回值為指針類型時,則必須是static的局部變量的地址作為返回值,若為auto類型,則返回為錯指針。在所有函數(shù)體外定義的是全局量,加了在所有函數(shù)體外定義的是全局量,加了static修飾符后不管在哪里都存放在全局區(qū)(靜態(tài)區(qū)),在所有函數(shù)體外修飾符后不管在哪里都存放在全局區(qū)(靜態(tài)區(qū)),在所有函數(shù)體外定義的定義的static變量表示在該文件中有效,不能變量表示在該

7、文件中有效,不能extern到別的文件用;在函數(shù)體內(nèi)定義的到別的文件用;在函數(shù)體內(nèi)定義的static表示只在該函數(shù)體表示只在該函數(shù)體內(nèi)有效內(nèi)有效。另外,函數(shù)中的函數(shù)中的“adgfdf“這樣的字符串存放在常量區(qū)這樣的字符串存放在常量區(qū)。對比:1性能棧:棧:棧存在于存在于RAM中。棧是中。棧是動態(tài)的動態(tài)的,它的存儲速度是第二快的,它的存儲速度是第二快的。stack堆:堆:堆位于位于RAM中,是一個中,是一個通用的內(nèi)存池通用的內(nèi)存池。所有的對

8、象所有的對象都存儲在堆中都存儲在堆中。heap2申請方式stack【棧】:由系統(tǒng)自動分配由系統(tǒng)自動分配。例如,聲明在函數(shù)中一個局部變量例如,聲明在函數(shù)中一個局部變量intb系統(tǒng)自動在棧中為系統(tǒng)自動在棧中為b開辟空間開辟空間。heap【堆】:需要程序員自己申請,并指明大小需要程序員自己申請,并指明大小,在c中malloc函數(shù)如p1=()malloc(10)在C中用new運算符如p2=()malloc(10)但是注意:p1、p2本身本身是在

9、棧中的是在棧中的。3申請后系統(tǒng)的響應?!緎tack】:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常提示棧溢出。:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常提示棧溢出。堆【heap】:首先應該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表,當系統(tǒng)收到程序的申請時,會遍歷該鏈表,:首先應該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表,當系統(tǒng)收到程序的申請時,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結(jié)

10、點,然后將該結(jié)點從空閑結(jié)點鏈表中刪除,并將該結(jié)點的空間分配給程序;尋找第一個空間大于所申請空間的堆結(jié)點,然后將該結(jié)點從空閑結(jié)點鏈表中刪除,并將該結(jié)點的空間分配給程序;另外,對于大多數(shù)系統(tǒng),會在這塊內(nèi)存空間中的首地址處記錄本次分配的大小,這樣,代碼中的語句才能正確的釋放本內(nèi)存空間。另外,由于找到的堆結(jié)點的大小不一定正好等于申請的大小,系統(tǒng)會自動的將多余的那系統(tǒng)會自動的將多余的那部分重新放入空閑鏈表中部分重新放入空閑鏈表中。4申請大小的限制

11、棧【stack】:在:在Windows下,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂下,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的,在的地址和棧的最大容量是系統(tǒng)預先規(guī)定好的,在WINDOWS下,棧的大小是下,棧的大小是2M(也有的說是(也有的說是1M,總之是一個編,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示譯時就確

12、定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。。因此,能從棧獲得的空間較小。堆【heap】:堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計

13、算機系統(tǒng)中有效的虛擬內(nèi)存堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。5申請效率的比較?!緎tack】:由系統(tǒng)自動分配,速度較快。但程序員是無法控制的。:由系統(tǒng)自動分配,速度較快。但程序員是無法控制的。堆【heap】:是由:是由new分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便.另外,在WINDOWS下,最好的方

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論