C/C++内存分配
一、C/C++内存分配
C/C++语言中,内存主要分配在一下五个存储区:
1.栈:栈中存储局部变量以及函数实参, 由编译器负责分配释放,函数结束,栈中数据失效。
2堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。分配方式类似于链表。
3全局区/静态区:存放全局变量以及静态变量。程序一经编译好,该区域便存在。并且在C语言中初始化的全局变量和静态变量和未初始化的放在相邻的两个区域(在C++中,由于全局变量和静态变量编译器会给这些变量自动初始化赋值,所以没有区分了)。由于全局变量一直占据内存空间且不易维护,推荐少用。程序结束时释放。
4常量区:存放各种常量(const修饰以及字符串)。
5代码区:存放二进制代码。
二、栈和堆的区别
1.栈是系统提供的功能,特点是效率高,缺点是数据不灵活;堆是函数库提供的功能,数据适应面广,但是效率较低。
2.栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部结构,不一定唯一。
3.栈中数据分配与释放,由编译器自动完成;堆中需要手动完成。
4.栈向下生长,堆向上生长。
5.堆中会出现碎片,栈中不会,因为栈是后进先出的队列。
三、实例
int a = 0;// 全局初始化区
char *p1;// 全局未初始化区
int main(){
int b; // 栈
char s[] =\"abc\"; // 栈
char *p2;// 栈
char *p3 =\"123456\"; //123456\\0 在常量区, p3 在栈上。
static intc =0;// 全局(静态)初始化区
p1 = newchar[10];
p2 = newchar[20];
// 分配得来得和字节的区域就在堆区。
strcpy(p1,\"123456\"); //123456\\0 放在常量区,编译器可能会将它与 p3 所指向的 \"123456\" 优化成一个地方。
}