轉載請註明地址: http://www.openext.org/2014/04/stackheap/
棧與系統的設計有關,由系統來管理。不過,程式員可以通過如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雖然內容相同,但是它們是棧上的字元數組所有地址是不同。