c編程中的堆與棧

來源:互聯網
上載者:User

轉載請註明地址: 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雖然內容相同,但是它們是棧上的字元數組所有地址是不同。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.