程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c編程中的堆與棧

c編程中的堆與棧

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved