一.内存分区的意义
不同分区的数据具有不同的生命周期,可以给编程更大的灵活性;
二.四大分区
1.栈
非静态局部变量,函数参数,返回值等
存在于栈空间变量的特点
不需要手动进行内存的开辟和空间的释放,由栈自动分配和释放空间。
2.堆(自由存储区)
动态开辟的内存空间
3.数据段(全局区)
全局变量和static修饰的静态变量
4.代码段
存放函数体的二进制代码,只读常量(如字符串常量)
三.代码演示各个分区的变量
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int globalVar = 1; //globalVar:全局变量,存放在数据段
static int staticGlobalVar = 1; //staticGlobalVar:静态变量,存放在数据段
void Test()
{
static int staticVar = 1; //staticVar:静态变量,存放在数据段
int localVar = 1; //localVar:非静态局部变量,存放在栈中
int num1[10] = { 1, 2, 3, 4 }; //num1:非静态局部变量,存放在栈中
//char2:数组,非静态局部变量,存放在栈中
//*char2:存放在栈中,将char2看作指针,*char2指向"abcd"这个字符串
//下面的语句定义了一个char2数组,将字符串"abcd"的值拷贝到char2数组中,
//*char2指向的这个字符串就等同于一个普通的局部变量(匿名对象),局部变量存放在栈上
char char2[] = "abcd";
//pChar3:非静态局部变量,存放在栈中 *pChar3:字符串常量,存放在代码段
char* pChar3 = "abcd";
//ptr1:指针,非静态局部变量,存放在栈中 *ptr1:动态开辟的空间,存放在堆中
int* ptr1 = (int*)malloc(sizeof (int)* 4);
//ptr2:指针,非静态局部变量,存放在栈中 *ptr2:动态开辟的空间,存放在堆中
int* ptr2 = (int*)calloc(4, sizeof(int));
//ptr3:指针,非静态局部变量,存放在栈中 *ptr3:动态开辟的空间,存放在堆中
int* ptr3 = (int*)realloc(ptr2, sizeof(int)* 8);
free(ptr1);
free(ptr3);
}
void main()
{
Test();
}