由編譯器自動分配釋放,存放函數的參數值,局部變量的值等;程序員
通常由程序員分配釋放(動態內存申請與釋放),若程序員不釋放,程序結束時可能有操做系統回收;函數
全局變量和靜態變量的存儲是放在一塊兒的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域,該區域在程序結束後由操做系統釋放; 佈局
常量區——字符串常量和其餘常量的存儲位置,程序結束後由操做系統釋放;spa
存放函數的二進制代碼;操作系統
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"); }
棧區的生長方向從大到小
堆區的生長方向從小到大