棧與系統的設計有關,由系統來管理。不過,程序員可以通過如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雖然內容相同,但是它們是棧上的字符數組所有地址是不同。