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

2021-03-27 18:44:13 字數 4938 閱讀 4813

1樓:匿名使用者

資料結構裡堆和棧,原理差不多都是先進後出,但是堆一般是乙個二叉樹,是非線性,比如堆排序。棧往往是線性。

c語言裡堆和棧是作業系統對記憶體管理實現的兩個不同部分。

棧空間是作業系統自己管理,分配,釋放也是作業系統做。普通區域性變數都存在棧裡。

堆區的空間是使用者自己分配管理,比如每一次malloc必須自己free。要不然作業系統不會幫你釋放。

c語言還有乙個**段,這個區域程式執行後不可寫,一般用來儲存常量。

2樓:匿名使用者

一、程式的記憶體分配

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

3、全域性區(靜態區)(static)—全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放

4、文字常量區—常量字串就是放在這裡的。 程式結束後由系統釋放5、程式**區—存放函式體的二進位制**。

二、例子程式

//main.cpp

int a = 0; //全域性初始化區

char *p1; //全域性未初始化區

main()

3樓:匿名使用者

壓根沒有關係,棧是順序結構,堆是樹形結構,兩個資料結構各有用途

**c語言中堆和棧的區別

c語言中記憶體堆和棧的區別

4樓:匿名使用者

函式體內的自動變數占用棧空間,呼叫函式時使用棧空間傳遞引數返回值等資訊;使用malloc()類的函式分配的空間占用堆

5樓:泰燦融朗麗

給你寫個小例子說明吧,乙個小函式。

void

testfunction()

上面函式中,變數a的記憶體就在棧中,a的生命週期只在大括號內,出了testfunction的大括號這塊棧空間就被釋放了。

而上面函式通過呼叫malloc函式給pa分配了3*sizeof(int)個位元組長度的記憶體,這段記憶體就在堆中。

即使出了testfunction函式的大括號,這段記憶體也依然被占用著。不過,由於pa這個指標的生命週期

出了大括號就結束了,所以無法再用pa來引用這塊記憶體了。

上面只是舉例,真正程式設計不會這樣寫,這樣pa指向的記憶體就無法被釋放了,造成記憶體洩露。

c語言中的棧和堆是什麼?

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

6樓:匿名使用者

棧是先入後出、後入先出的儲存區域,對作業系統來說管理比較簡單,只需要記版錄棧底和當前棧

權頂的位置即可,一般用於保護現場。比如呼叫函式時,呼叫點pc位址被壓入堆疊、函式引數被壓入棧,在函式呼叫結束時會被彈出堆疊指令丟棄或被返回語句利用。

堆是提供給當前程式執行時刻開設緩衝區(如使用malloc函式、new等),由應用程式主動管理(釋放用free和delete),比如printf語句就需要利用堆來臨時儲存輸出資訊。另外由子程式中開設的非靜態變數一般存放在堆中,退出子程式後被自動釋放。

7樓:匿名使用者

堆:指的是認為用**動態申請的記憶體空間,所有手動釋放。例如:malloc的記憶體

棧:就是當變數生命週期結束,由系統自動**記憶體。

c語言中記憶體堆和棧的區別是什麼?

8樓:匿名使用者

給你寫個小例子說明吧,乙個小函式。

void testfunction()

上面函式中,變數a的記憶體就在棧中,a的生命週期只在大括號內,出了testfunction的大括號這塊棧空間就被釋放了。

而上面函式通過呼叫malloc函式給pa分配了3*sizeof(int)個位元組長度的記憶體,這段記憶體就在堆中。

即使出了testfunction函式的大括號,這段記憶體也依然被占用著。不過,由於pa這個指標的生命週期 出了大括號就結束了,所以無法再用pa來引用這塊記憶體了。

上面只是舉例,真正程式設計不會這樣寫,這樣pa指向的記憶體就無法被釋放了,造成記憶體洩露。

9樓:裘**郯妝

堆記憶體是用malloc或new分配的記憶體空間,棧是用關鍵字定義出變數的記憶體空間.有些時候必須用堆記憶體,如:鍊錶.堆最好是用來存放大資料.而棧本身就小,但速度快.

10樓:餘長青威書

比較簡單的理解是堆要靠自己管理,棧是系統幫你管理的,一般堆空間很大適合放大型的資料結構,棧空間有限一般僅僅放是函式的引數和內部的臨時變數

c語言中的棧、堆是什麼?

11樓:地面離家出走

c語言中的堆和棧都是一種資料項按序排列的資料結構。

棧就像裝資料的桶或箱子

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

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

堆像一棵倒過來的樹

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

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

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

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

12樓:匿名使用者

堆疊是一種執行「後進先出」演算法的資料結構。

設想有乙個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律:

先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以「先進後出」就是這種結構的特點。

堆疊就是這樣一種資料結構。它是在記憶體中開闢乙個儲存區域,資料乙個乙個順序地存入(也就是「壓入——push」)這個區域之中。有乙個位址指標總指向最後乙個壓入堆疊的資料所在的資料單元,存放這個位址指標的暫存器就叫做堆疊指示器。

開始放入資料的單元叫做「棧底」。資料乙個乙個地存入,這個過程叫做「壓棧」。在壓棧的過程中,每有乙個資料壓入堆疊,就放在和前乙個單元相連的後面乙個單元中,堆疊指示器中的位址自動加1。

讀取這些資料時,按照堆疊指示器中的位址讀取資料,堆疊指示器中的位址數自動減 1。這個過程叫做「彈出pop」。如此就實現了後進先出的原則。

堆疊是計算機中最常用的一種資料結構,比如函式的呼叫在計算機中是用堆疊實現的。

堆疊可以用陣列儲存,也可以用以後會介紹的鍊錶儲存。

下面是乙個堆疊的結構體定義,包括乙個棧頂指標,乙個資料項陣列。棧頂指標最開始指向-1,然後存入資料時,棧頂指標加1,取出資料後,棧頂指標減1。

#define max_size 100

typedef int data_type;

struct stack

; 在c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。

棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。

常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多.

13樓:圈圈叉叉叉叉圈

在c/c++中,記憶體分成5個區,他們分別是堆、棧、自由

儲存區、全域性/靜態儲存區和常量儲存區。

如果你的這兩個語句是出現在全域性部分,那這個i就是被儲存在全域性/靜態儲存區;如果是出現在區域性某個函式裡,那i就被儲存的棧裡面。具體可以怎麼理解?

棧裡的東西自動分配記憶體空間,自動釋放記憶體,而堆裡面的東西只要是用到記憶體的都要手動分配,malloc函式在這個時候就起作用了。

棧:就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

堆:就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

自由儲存區:就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

c語言裡棧和堆的區別整理

14樓:匿名使用者

棧區。由編譯器自動分配釋放,存放函式的引數值、區域性變數的值等。其操作方式類似於資料結構中的棧。

每當乙個函式被呼叫,該函式返回位址和一些關於呼叫的資訊,比如某些暫存器的內容,被儲存到棧區。然後這個被呼叫的函式再為它的自動變數和臨時變數在棧區上分配空間,這就是c實現函式遞迴呼叫的方法。每執行一次遞迴函式呼叫,乙個新的棧框架就會被使用,這樣這個新例項棧裡的變數就不會和該函式的另乙個例項棧裡面的變數混淆。

堆區(heap)。用於動態記憶體分配。堆在記憶體中位於bss區和棧區之間。一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時有可能由os**。

c語言中a和a的區別,C語言中a和a的區別

an和a的區別,用法區別 如果要列印的值是a 如printf d a 那列印出來的只是a的值.但是第二次列印的a值就是回 後的值.就是先答列印後 a就是先改變a的值,再列印出來.具體差別你可以自己試著執行比較一下.a a先加1,所以此時的a 9,所以輸出是9,a 是a先傳參,再減1,所以輸出是9。要...

c語言中和的區別C語言中和的區別

區別 1.運算子性質不同。是乙個位運算子。是乙個邏輯運算子。2.作用不同。是將兩個二進位制的數逐位相與,結果是相與之後的結果。就是判斷兩個表示式的真假性,只有兩個表示式同時為真才為真,有乙個為假則為假,具有短路性質。3.用途限制。除了是乙個位運算子,也是取位址符。就是乙個單純的邏輯運算子,沒有任何其...

c語言ba和ba的區別C語言中abab和abba有什麼區別

c語言b a 和b a 沒有區別。這個和 沒什麼關係,注意理解a 和 a的區別 a 先將a的值代入表示式,在表示式運算完畢後,再將a進行 處理。a 先將a進行 處理,再將a的值代入表示式。注意對於a 這裡有乙個 在表示式運算完畢後,再將a進行 處理 b a 這是乙個賦值表示式,所以先將a的值代入表示...