當前位置:首頁 » 編程語言 » c語言堆
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言堆

發布時間: 2022-01-13 14:08:34

c語言中有無堆的概念

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

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

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

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

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

代碼段指的是代碼段寄存器,你寫的代碼存放在這個寄存器里,等待CPU調用,這個屬於微機原理所討論問題,有興趣可以學學

㈡ C語言中的棧、堆是什麼

C語言中的堆和棧都是一種數據項按序排列的數據結構。

棧就像裝數據的桶或箱子

我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。

這就如同我們要取出放在箱子裡面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。

堆像一棵倒過來的樹

而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。

通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。

由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書。

雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。

(2)c語言堆擴展閱讀:

關於堆和棧區別的比喻

使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

參考資料來源:網路-堆棧



㈢ c語言中堆和棧的區別詳細解答

棧是先入後出、後入先出的存儲區域,對操作系統來說管理比較簡單,只需要記錄棧底和當前棧頂的位置即可,一般用於保護現場。比如調用函數時,調用點pc地址被壓入堆棧、函數參數被壓入棧,在函數調用結束時會被彈出堆棧指令丟棄或被返回語句利用。
堆是提供給當前程序運行時刻開設緩沖區(如使用malloc函數、new等),由應用程序主動管理(釋放用free和delete),比如printf語句就需要利用堆來臨時保存輸出信息。另外由子程序中開設的非靜態變數一般存放在堆中,退出子程序後被自動釋放。

㈣ C語言中的棧和堆是什麼

1、計算機中的內存分為兩部分:一部分是棧(stack,也稱堆棧),另一部分是堆(heap)。

2、 棧,可以看作是一摞卡片,最上面的卡片表示程序的當前作用域,這往往就是當前正在執行的函數。

3、堆,一段完全獨立於當前函數或者棧幀的內存區。如果一個函數中聲明了一些變數,而且希望當這個函數完成時其中聲明的變數仍然存在,就可以將這些變數置於堆中。

㈤ C語言中,什麼是棧,什麼是堆

1、棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變數等值。局部變數,任務線程函數之類的是放在(使用)棧裡面的,棧利用率高一些。其操作方式類似於數據結構中的棧。特別,棧是屬於線程的,每一個線程會有一個自己的棧。

2、堆區(heap):一般由程序員分配釋放,若程序員不釋放,則可能會引起內存泄漏。注意它和數據結構中的堆是兩回事,分配方式倒是類似於鏈表,常見的就是malloc出來的都是屬於堆區,就像固定出來的區域,到free的時候才釋放,有點類似全局的,靜態的。

(5)c語言堆擴展閱讀

棧內存是由編譯器自動分配與釋放的,它有兩種分配方式:靜態分配和動態分配。

1、靜態分配是由編譯器自動完成的,如局部變數的分配(即在一個函數中聲明一個int類型的變數i時,編譯器就會自動開辟一塊內存以存放變數i)。

2、動態分配由alloca函數進行分配,但是棧的動態分配與堆是不同的,它的動態分配是由編譯器進行釋放,無需任何手工實現。

㈥ C語言中內存堆和棧的區別

堆(heap)和棧(stack)原本是兩種不同的數據結構,在C語言內存表述中,代表著用這兩種數據結構管理的兩種內存塊。
堆由整個系統共享,各個進程擁有同一個堆。 棧由每個進程自行管理,也就是每個進程的棧是獨立的,互不相關。
具體區別如下:
一、棧上的內存由系統自動管理分配,用於存儲局部變數。 堆中的內存由編程人員主動申請,在C語言中申請內存的函數為malloc, 使用後需要編程人員自行調用free函數釋放。
二、從分配釋放及訪問速度上,棧內存的存取,申請釋放速度要高於堆內存。
三、棧內存相對於堆內存要小的多,所以在編程的時候,一般不建議使用占空間過大的局部變數。
四、堆中所有數據均由編程人員申請使用。 棧中除了存放函數中可見的局部變數外,還有各種系統環境數據。

㈦ 淺析C語言中堆和棧的區別

一、堆棧空間分配區別:
1、棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧;
2、堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
二、堆棧緩存方式區別:
1、棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放;
2、堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收演算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
三、堆棧數據結構區別:
堆(數據結構):堆可以被看成是一棵樹,如:堆排序;
棧(數據結構):一種先進後出的數據結構。

㈧ c語言中 堆怎麼理解

c中代碼在代碼段,數據在數琚段,局部變數在堆棧中,除了這些已經明確安排好的空間,剩餘空間稱為自由空間,要利用這些空間可以通過內存分配函數,動態分配,這部分空間稱為堆空間!堆空間相比棧空間是非常大的,棧空間是非常有限的windows下32位程序,預設約為1M而每個程序的地址空間為4G,堆空間使用1~2G內存是不成問題的。
至於p那個指針本身是局部變數,p所指內存在堆上出了函數也是可以用的,必須能夠傳遞出去才行,p自己只能在函數內部使用!傳遞出去的指針必須在適當的時候釋放,否則會產生內存泄漏!
1)這么理解似平不是問題,不過太膚淺;
2)由於各種編程語言(包括c,c )不能(也不允許)直接訪問內存,和cpu各寄存器,要通過標志符(就是一個名字)來訪問它們,這就牽扯到名字的作用域問題了!而內存,寄存器這些東西本來就在和語言無關,只和該語言如何使用有關,通過名字,我們可以更清晰的理解代碼的意圖,可以更好的安排代碼,所以各種語言,通過名字來使用內存和寄存器!這樣名字就和內存,寄存器這種實際存在的東西聯繫到一起了!變數是最經常使用的一種名字了!對c,這種語言自動變數在堆上,只有函數內部甚至內部的一對大括弧內可用(即變數名可見,如果變數的相關內容,如變數值,變數地址,傳遞出去,外部也是可以使用的,當然同一程序的內部變數地址就不要傳遞了!同樣參數和返回值也不要把自動變數地址傳遞出去,因為已經過期,有可能被別的東西佔用了,使用會么錯的,而動態分配的內存其實屬於全局性質的,傳遞出去是沒問題的,只要能夠及時釋放就行,那就是無名全局數據,可以通過有名變數(指針)來使用,因為沒有名字所以不能直接促使用,因為是全局的所以可以任意傳遞,因為要管理的,所以用完要釋放!因為無名,所以只能間接引用!

㈨ c語言堆排序代碼

#include<stdio.h>

void shift(int a[] , int i , int m)
{
int k , t;

t = a[i]; k = 2 * i + 1;
while (k < m)
{
if ((k < m - 1) && (a[k] < a[k+1])) k ++;
if (t < a[k]) {a[i] = a[k]; i = k; k = 2 * i + 1;}
else break;
}
a[i] = t;
}

void heap(int a[] , int n) //a 為排序數組,n為數組大小(編號0-n-1)
{
int i , k;

for (i = n/2-1; i >= 0; i --) shift(a , i , n);
for (i = n-1; i >= 1; i --)
{
k = a[0]; a[0] = a[i]; a[i] = k;
shift(a , 0 , i);
}

}
void main()
{
int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
heap(a,10);
for(i=0;i<10;i++)
printf("%d",a[i]);
}

㈩ C語言中的堆和棧的定義

在數據結構上要知道堆棧,盡管我們這么稱呼它,但實際上堆棧是兩種數據結構:堆和棧。
堆和棧都是一種數據項按序排列的數據結構。
棧就像裝數據的桶或箱子
我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。
這就如同我們要取出放在箱子裡面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。
堆像一棵倒過來的樹
而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。
通常我們所說的堆的數據結構,是指二叉堆。
堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。
由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。