本文目錄一覽:
c語言中 堆怎麼理解?
c中代碼在代碼段,數據在數琚段,局部變量在堆棧中,除了這些已經明確安排好的空間,剩餘空間稱為自由空間,要利用這些空間可以通過內存分配函數,動態分配,這部分空間稱為堆空間!堆空間相比棧空間是非常大的,棧空間是非常有限的windows下32位程序,缺省約為1M而每個程序的地址空間為4G,堆空間使用1~2G內存是不成問題的。
至於p那個指針本身是局部變量,p所指內存在堆上出了函數也是可以用的,必須能夠傳遞出去才行,p自己只能在函數內部使用!傳遞出去的指針必須在適當的時候釋放,否則會產生內存泄漏!
1)這麼理解似平不是問題,不過太膚淺;
2)由於各種編程語言(包括c,c )不能(也不允許)直接訪問內存,和cpu各寄存器,要通過標誌符(就是一個名字)來訪問它們,這就牽扯到名字的作用域問題了!而內存,寄存器這些東西本來就在和語言無關,只和該語言如何使用有關,通過名字,我們可以更清晰的理解代碼的意圖,可以更好的安排代碼,所以各種語言,通過名字來使用內存和寄存器!這樣名字就和內存,寄存器這種實際存在的東西聯繫到一起了!變量是最經常使用的一種名字了!對c,這種語言自動變量在堆上,只有函數內部甚至內部的一對大括號內可用(即變量名可見,如果變量的相關內容,如變量值,變量地址,傳遞出去,外部也是可以使用的,當然同一程序的內部變量地址就不要傳遞了!同樣參數和返回值也不要把自動變量地址傳遞出去,因為已經過期,有可能被別的東西佔用了,使用會么錯的,而動態分配的內存其實屬於全局性質的,傳遞出去是沒問題的,只要能夠及時釋放就行,那就是無名全局數據,可以通過有名變量(指針)來使用,因為沒有名字所以不能直接促使用,因為是全局的所以可以任意傳遞,因為要管理的,所以用完要釋放!因為無名,所以只能間接引用!
C程序中如何使用堆棧
先從大家比較熟悉的棧說起,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。這就如同要取出放在箱子裏面底下的東西(放入的比較早的物體),首先要移開壓在它上面的物體(放入的比較晚的物體)。而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。通常所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同在圖書館的書架上取書,雖然書的擺放是有順序的,但是想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,可以直接取出想要的書。
下面就說說C語言程序內存分配中的堆和棧,這裡有必要把內存分配也提一下,一般情況下程序存放在Rom或Flash中,運行時需要拷到內存中執行,內存會分別存儲不同的信息。
內存中的棧區處於相對較高的地址以地址的增長方向為上的話,棧地址是向下增長的,棧中分配局部變量空間,堆區是向上增長的用於分配程序員申請的內存空間。另外還有靜態區是分配靜態變量,全局變量空間的;只讀區是分配常量和程序代碼空間的;以及其他一些分區。來看一個網上很流行的經典例子:
main.cpp
int
a
=
0;
全局初始化區
char
*p1;
全局未初始化區
main()
{
int
b;
棧
char
s[]
=
“abc”;
棧
char
*p2;
棧
char
*p3
=
“123456”;
123456\0在常量區,p3在棧上。
static
int
c
=0;
全局(靜態)初始化區
p1
=
(char
*)malloc(10);
堆
p2
=
(char
*)malloc(20);
堆
}
堆和棧的第一個區別就是申請方式不同:棧(英文名稱是stack)是系統自動分配空間的,例如定義一個
char
a;系統會自動在棧上為其開闢空間。而堆(英文名稱是heap)則是程序員根據需要自己申請的空間,例如malloc(10);開闢十個位元組的空間。由於棧上的空間是自動分配自動回收的,所以棧上的數據的生存周期只是在函數的運行過程中,運行後就釋放掉,不可以再訪問。而堆上的數據只要程序員不釋放空間,就一直可以訪問到,不過缺點是一旦忘記釋放會造成內存泄露。
C語言中”棧”和”堆”怎麼理解?
堆(heap)和棧(stack)有什麼區別??
簡單的可以理解為:
heap:是由malloc之類函數分配的空間所在地。地址是由低向高增長的。
stack:是自動分配變量,以及函數調用的時候所使用的一些空間。地址是由高向低減少的。
一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)—
由編譯器自動分配釋放
,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap)
—
一般由程序員分配釋放,
若程序員不釋放,程序結束時可能由OS回收
。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
C語言中的堆和棧的定義?
在數據結構上要知道堆棧,儘管我們這麼稱呼它,但實際上堆棧是兩種數據結構:堆和棧。
堆和棧都是一種數據項按序排列的數據結構。
棧就像裝數據的桶或箱子
我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。
這就如同我們要取出放在箱子裏面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。
堆像一棵倒過來的樹
而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。
通常我們所說的堆的數據結構,是指二叉堆。
堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。
由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/183906.html