【C語言】程序內存四區

1.棧區(臨時區)(stack)

    由編譯器自動分配釋放,存放函數的參數值,局部變量的值等;程序員

2.堆區(heap)

    通常由程序員分配釋放(動態內存申請與釋放),若程序員不釋放,程序結束時可能有操做系統回收;函數

3.全局區(靜態區)(static)

    全局變量和靜態變量的存儲是放在一塊兒的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域,該區域在程序結束後由操做系統釋放; 佈局

    常量區——字符串常量和其餘常量的存儲位置,程序結束後由操做系統釋放;spa

4.程序代碼區

    存放函數的二進制代碼;操作系統

char * getString1()
{
 char *p1 = "hello";
 return p1;
}
char * getString2()
{
 char *p2 = "hello";
 return p2;
}
void main()
{
 int i = 0;
 char *p1 = getString1();
 char *p2 = getString2();
 printf("p1:%s\n", p1);
 printf("p2:%s\n", p2);
 printf("p1:%p\n", p1);
 printf("p2:%p\n", p2);
 system("pause");
}

 當getString1()和getString2()中的字符串變量都定義爲"hello"的時候code

    

    把getString2()中的字符串變量定義爲"hello1"的時候blog

    

    函數調用模型必須和程序四內存區綜合起來考慮內存

    規則1:主調函數分配的內存(棧區、堆區、全局區)均可以在被調用函數中使用;字符串

    規則2:被調用函數中分配的內存,要分狀況:get

               在棧區中分配的內存,在主調函數中是不能使用的;

 

    正確理解程序運行內存佈局圖!!

堆棧區的生長方向

void main()
{
 char *p1 = NULL;
 char *p2 = NULL;
 p1 = (char *)malloc(16);
 p2 = (char *)malloc(16);
 printf("p1:%p, p2:%p\n", p1, p2);
 printf("&p1:%p, &p2:%p\n", &p1, &p2);
 system("pause");
}

  

    棧區的生長方向從大到小

    堆區的生長方向從小到大

相關文章
相關標籤/搜索