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