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

2021-04-20 16:51:37 字數 3687 閱讀 9113

1樓:匿名使用者

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

。void testfunction()

上面函式中,變數a的記憶體就在棧中,a的生命周專

期只在大括號內屬,出了testfunction的大括號這塊棧空間就被釋放了。

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

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

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

2樓:劉文正粉絲

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

3樓:匿名使用者

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

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

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

4樓:匿名使用者

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

5樓:泰燦融朗麗

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

void

testfunction()

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

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

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

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

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

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

6樓:匿名使用者

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

void testfunction()

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

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

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

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

7樓:裘**郯妝

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

8樓:餘長青威書

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

在c語言中,記憶體分配時棧和堆的區別,各自的優缺點

9樓:文化廚子

棧是自動分配 的,隨用隨**。

堆這個分好多種的,以windows系統來說,你運專行一個程式,就至屬少有兩個堆,一個是程序預設堆,一個是動態分配堆 也就是c語言的中 malloc或者c++中的new分配的記憶體

說到本質其實沒啥區別,都是虛擬記憶體。。

c語言中堆和棧的區別

10樓:匿名使用者

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

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

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

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

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

11樓:匿名使用者

一、程式的記憶體分配

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

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

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

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

二、例子程式

//main.cpp

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

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

main()

12樓:匿名使用者

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

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

13樓:匿名使用者

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

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

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

c語言中堆和棧的區別

14樓:當作是一場煙火

簡單的說 就是堆是無序的,你可以任意取任意插入操作,而棧對任意元素的操作都是有秩序的有約束的,

15樓:勢爾琴尾葛

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

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

16樓:陽痴靈臧靚

棧是先入後出、後入先出的儲存區域,對作業系統來說管理比較簡單,只需要記錄棧底和當前棧頂的位置即可,一般用於保護現場。比如呼叫函式時,呼叫點pc地址被壓入堆疊、函式引數被壓入棧,在函式呼叫結束時會被彈出堆疊指令丟棄或被返回語句利用。

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

c語言中的棧是指什麼啊,C語言中的棧堆是什麼?

是一種資料結構.這種結構的存取原則相當於取放盤子的過程,放的時候將盤子一個一個堆起來放,取的時候先取原先最後放入的一個,然後依次類推.即後進先出的原則.棧有順序 陣列等 和鏈式 連結串列 兩種儲存結構,它的邏輯結構實質是線性表中的一種,只是這種線性表只允許在其中一端進行存取操作.更為詳細的解釋請參考...

c語言中的錯誤和警告有什麼區別,C語言中的錯誤和警告有什麼區別

錯誤會導致程式無法編譯通過,進而不能執行 而警告是說程式中有些 編寫不是非常恰當,不會影響程式編譯,在少數情況下會影響程式執行 一般警告可以忽略,而錯誤是必須要修改的 錯誤 如果出現,本程式將無法執行。警告 警告或者說是建議,比如你宣告瞭一個變數,並沒有使用。它會警告你。錯誤一般是 中出現語法錯誤,...

c語言中與的區別,c語言中「 」與「 」有什麼區別?

c語言中 與 的區別如下 是否為單行註釋 是用於多種語言的單行註釋語句。是註釋語句,不限制行數,在 和 之間的即為註釋。實用性的區別 是用於多種語言的單行註釋語句,適用方便快捷,但是實用性不如多行註釋 是註釋語句,不限制行數,在 和 之間的即為註釋,實用性大,但是符號鍵盤敲打麻煩。程式編譯時,不對註...