c程式設計中的堆與棧

2021-12-30 01:08:21 字數 1068 閱讀 2058

棧與系統的設計有關,由系統來管理。不過,程式設計師可以通過如new malloc語句在堆中獲取記憶體。

棧是向下生長的一塊連續的記憶體區域。棧的大小是系統設定好的。堆是向上生長,不連續的記憶體區域。因為作業系統是用鍊錶來管理記憶體的。

堆的大小受系統有效虛擬記憶體的限制。

棧: 在函式呼叫時,第乙個進棧的是主函式中函式呼叫後的下一條指令的位址,然後是函式的各個引數,注意靜態變數是不入棧的。當本次函式呼叫結束後,區域性變數先出棧,

然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行。

堆:堆中的具體內容有程式設計師安排。

一般舉例

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); 堆

int main(){

char *p1="helloworld";

char *p2="helloworld";

char p3="helloworld";

char p4="helloworld";

printf("0x%08x\n",p1);

printf("0x%08x\n",p2);

printf("0x%08x\n",p3);

printf("0x%08x\n",p4);

輸出結果:

test@ubuntu:~$ ./a.out

0x0040072c

0x0040072c

0xc3340450

0xc3340460

因為指標p1,p2所指向的資料儲存在常量區域,又因它們是數值相同,所以p1,p2的值是相同的。

p3,p4雖然內容相同,但是它們是棧上的字元陣列所有位址是不同。

C 中的堆與棧

也不知道是什麼原因,很多人總是把堆和棧混合一起,在寫程式時,總是經常脫口而出地說堆疊。網上的一些資料說堆疊的叫法是有歷史原因的,至於具體是什麼歷史原因,這不是本文所要討論的問題。堆 在資料結構中,堆是一種滿足 堆性質 至於什麼是堆性質可以查閱任何一本資料結構的書 的資料結構。然而,通常我們所指的堆都...

C 中記憶體中堆與棧的區別

1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...

c 程式中堆與棧的區別

一 申請方式 stack 由系統自動分配。例如,宣告在函式中乙個區域性變數 int b 系統自動在棧中為b開闢空間 heap 需要程式設計師自己申請,並指明大小,在c中malloc函式 如p1 char malloc 10 在c 中用new運算子 如p2 char malloc 10 但是注意p1 ...