棧與系統的設計有關,由系統來管理。不過,程式設計師可以通過如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 ...