程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言問答 >> C語言中有無堆的概念?

C語言中有無堆的概念?

編輯:C語言問答

C語言中有無堆的概念?

我知道C++中有棧、堆、靜態區、代碼區的概念,但是似乎C標准中貌似沒有堆的概念。好像所有的動態存儲都是在棧中進行的,我們知道堆中的空間需要顯式利用delete調用對象析構才能釋放(Java例外),而C中沒有堆的概念,所有的動態數據全部在棧中進行處理,一旦函數調用結束,所有對象的分配的棧空間全部被回收。

各位高人指點一下我的理解是否正確??

最佳回答:

棧,堆,靜態區,是內存開辟的三個專屬區,C語言的內存分配也就只有這三種方式

1.內存在棧上創建(棧結構)
如函數裡定義的變量int i; char str[80],還有保存函數的所有信息的內存都是在棧上創建的
這塊內存是連續的,就好比是一個數組,所以你在內存分配的時候,會發現變量地址是連續的

2.內存在堆上創建(鏈表結構)
這塊內存是有很多內存塊組成,很像鞭炮一樣串在一根繩子上,但這些內存塊的大小不一樣,存儲在鏈表結構中的結點中,當你用malloc動態申請是,編譯器會根據你內存塊的大小從表頭一次檢索,直到鏈表中的內存塊大於等於你所申請的內存大小時,返回該快內存,如果鏈表上的內存塊大於你所申請的內存時,會將多余內存回收到鏈表結構,這也就是為什麼動態申請內存容易造成內存碎片的產生原因。所以分配內存時你會發現他們的地址不連續

3內存在靜態區創建
如全局變量,static變量
這塊內存也是連續的,也像一個數組,但它跟棧上創建內存唯一的區別是,內存作用時間不一樣,靜區內存作用時間是整個“程序”運行時間,棧上內存作用時間是整個“函數”的運行時間,注意“程序”和“函數”的區別

而堆內存作用時間范圍是0到整個“程序”運行時間,如果你要在小於整個“程序”運行時間內釋放這塊內存的話,就要使用free,所以是手動申請手動釋放,你自己可以控制,但是寫代碼的好習慣習慣是程序中有幾個malloc就有幾個free,這樣可以防止內存洩露




代碼段指的是代碼段寄存器,你寫的代碼存放在這個寄存器裡,等待CPU調用,這個屬於微機原理所討論問題,有興趣可以學學
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved