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