內存四區模型:
操做系統給C/C++編寫的程序分配內存,一般將分配的內存劃分爲如下四個區域:
1.棧區:存放局部變量,用完由操做系統自動釋放
2.堆區:動態分配給程序的內存區域,由程序員手動釋放
3.數據區:
分爲兩種:
(1)常量區:存放常量,通常是字符串常量
(2)全局區/靜態區:存放全局變量和靜態變量
4.代碼區:
存放可執行代碼的區域程序員
示例以下:數組
1 int main() 2 { 3 char buf1[10] = "aaaa"; 4 5 char buf2[] = "bbbb"; 6 7 char *p1 = "1111"; 8 9 //動態分配內存 10 char *p2 = (char *)malloc(10*sizeof(char)); 11 12 strcpy(p2, "3333"); 13 14 return 0; 15 }
內存四區圖:spa
補充:操作系統
棧的生長方向和數組內元素的存放方向相反
堆的生長方向和數組內元素的存放方向相同code
驗證:blog
1 #include <stdio.h> 2 3 int main() 4 { 5 char buf1[10] = "aaaa"; 6 char buf2[] = "bbbb"; 7 char *p1 = "1111"; 8 //動態分配內存 9 char *p2 = (char *)malloc(10 * sizeof(char)); 10 strcpy(p2, "3333"); 11 12 printf("buf1的地址是%d\n", buf1); 13 printf("buf1的地址是%d\n", buf2); 14 15 printf("======================\n"); 16 17 printf("buf[0]的地址是%d\n", &buf1[0]); 18 printf("buf[0]的地址是%d\n", &buf1[1]); 19 20 printf("======================\n"); 21 22 printf("p2[0]的地址是%d\n", &p2[0]); 23 printf("p2[1]的地址是%d\n", &p2[1]); 24 25 return 0; 26 }
打印結果:內存
說明棧的生長方向是向下的,數值逐漸減少;棧中數組的元素的存放方向與之相反,是向上的,數值逐漸增大;堆的生長方向向上,數值逐漸增大。字符串