内存四区模型:
操作系统给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 }
内存四区图:
补充:
栈的生长方向和数组内元素的存放方向相反
堆的生长方向和数组内元素的存放方向相同
验证:
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 ", buf1); 13 printf("buf1的地址是%d ", buf2); 14 15 printf("====================== "); 16 17 printf("buf[0]的地址是%d ", &buf1[0]); 18 printf("buf[0]的地址是%d ", &buf1[1]); 19 20 printf("====================== "); 21 22 printf("p2[0]的地址是%d ", &p2[0]); 23 printf("p2[1]的地址是%d ", &p2[1]); 24 25 return 0; 26 }
打印结果:
说明栈的生长方向是向下的,数值逐渐减小;栈中数组的元素的存放方向与之相反,是向上的,数值逐渐增大;堆的生长方向向上,数值逐渐增大。