(一)内存分布
1.1 C
- BSS段: 用来存放程序中未初始化的全局变量和未初始化的静态变量。
- 数据段:用来存放程序中已初始化的全局变量和已经初始化的静态变量。
- 代码段:用来存放程序执行代码。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等
- 堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)
- 栈:栈又称堆栈, 存放程序的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外在函数被调用时,栈用来传递参数和返回值。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。
1.2 C++
- 栈:存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等;在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
- 堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
- 自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
- 全局/静态存储区:存放全局变量、静态数据,const常量。在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
- 常量存储区:这是一块比较特殊的存储区,他们里面存放的是不允许被修改的常量字符串。
(二)内存分配方式
2.1 C中内存的动态分配
2.1.1 malloc、relloc、calloc和free
1、void* malloc(字节数):无初始化的申请一块内存
2、void* calloc(单个元素字节&#x