前言
我们最初熟知的内存开辟方式:
int val = 20: 在栈空间上开辟4个字节 char array[10]: 在栈空间上开辟10个字节的连续空间上述开辟空间的方式有两个特点:
空间开辟大小是固定的。 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。但是对于空间的需求,不仅仅是上述的情况,有时候我们需要的空大小在程序运行时才能知道,那此时静态的开辟空间的方式就不能满足了,我们这时候只能试试动态内存开辟。
这篇博客就来带大家梳理一下C/C++中的内存管理。
一:C/C++内存分布
对内存分段是计算机的管理机制

1.栈又叫堆栈,存放非静态局部变量、函数参数和返回值等等,栈是向下增长的。,处理器的指令集中、效率高,但是分配内存的容量有限。(函数执行结束后这些存储单元自动释放)
2.内存映射段是高效的IO映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
3.堆用于程序运行时动态内存分配,堆是向上增长的。(一般由人为分配释放,若没有人为释放则程序结束时可能由OS回收。)
4.数据段存储全局数据、静态数据。(程序结束后由系统自动释放)
5.代码段存储可执行的代码、只读常量。
注意:
栈区向下生长,先开辟的空间地址大于后开辟的空间地址。(int a = 10,int b = 20,&a>&b)
堆区向上生长,但是不保证后开辟的空间地址大于先开辟的空间地址,因为堆区存在人为的空间释放。
二:C语言中的内存管理方式
C语言提供了动态内存函数来进行内存的动态开辟工作:malloc、calloc、realloc、free
2.1 malloc
函数功能
void✳ malloc(size_t size以字节为单位的空间大小)
举个栗子:int* ptr = (int*) malloc(sizeof(int)*10);
malloc向内存申请一块大小为size的连续可用空间,并返回指向这块空间的指针。
函数特性
1.开辟成功,返回一个指向该空间的指针。
2.开辟失败,返回一个NULL指针,因此malloc的返回值一定要做检查。
3.返回值的类型是void✳,malloc函数并不知道开辟空间的数据类型,具体在使用的时候由使用者自己决定。
4.如果参数size为0,malloc的行为是标准未定义的,取决于编译器。
2.2 calloc
函数功能
void✳ calloc(size_t num元素个数,size_t size以字节为单位的空间大小)
举个栗子:int* ptr = calloc(10,sizeof(int));
calloc向内存为num个大小为size的元素开辟一块连续空间,并且把空间的每个字节都初始化为0。










