C/C++的内存分布
C/C++的内存分布主要分成四个区:栈区,堆区,静态区(数据段),常量区(代码段)。
后两种括号中的称呼是从操作系统角度出发的。
1.栈区
栈区内存主要存储的是局部变量,局部变量的生命周期仅在所处函数栈帧中。
2.堆区
堆区内存主要存储的是我们动态申请的内存,如malloc、calloc、realloc,或者new动态申请的对象。
3.静态区
静态区主要存储的是全局变量,或者static修饰的变量、函数。
4.常量区
常量区就是存储的是常量,以及一些指令。
例题:
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = { 1, 2, 3, 4 };
char char2[] = "abcd";
const char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof(int) * 4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
free(ptr3);
}
变量globalVar分布于静态区,是一个全局变量。
变量staticGlobalVar分布于静态区,是一个全局变量。
变量staticVar分布于静态区,由于在函数内部被static修饰了。
变量localVar分布于栈区,是一个局部变量。
数组num1分布于栈区,是一个局部变量。
数组char2分布于栈区,是一个局部变量。
*char2分布于栈区,char2是数组名,数组名是数组首元素的地址,对其解引用那就是元素a。
变量pChar3分布于栈区,此变量被const修饰,并且在星号的左边,修饰的是变量pChar3指向的内容,本身依旧还是一个局部变量。
星号pChar3分布于常量区,表示的是其指向常量区的abcd字符串。
变量ptr1分布于栈区,它是一个指针变量,本身是一个局部变量。
变量星号ptr1分布于堆区,*ptr就是对变量ptr1的解引用,其内容是指向堆区的一块空间。
后面的ptr2,ptr3也是分布于栈区,*ptr2,*ptr也是分布于堆区,道理同ptr1,*ptr1。