• 1. C\C++程序的内存分配堆和栈的区别
  • 2. 一、基本概念1.栈区(stack) 由编译器自动分配、释放 存放函数的参数值、局部变量的值等 类似于数据结构中的栈 2.堆区(heap) 一般由程序员分配、释放, 若程序员不释放,程序结束时可能由OS回收。 与数据结构中的堆不同,分配方式类似于链表
  • 3. 3、初始化数据区/静态数据区(static) 全局变量、静态变量、常量数据的存储 程序结束后由系统释放 4、未初始化区 常量字符串 程序结束后由系统释放 5、代码区 存放CPU执行的机器指令 可共享、只读的
  • 4. (本页无文本内容)
  • 5. 二、例子程序//main.cpp int a = 0; (全局初始化区) char *p1;(全局未初始化区) main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈
  • 6. char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来的10和20字节的区域就在堆区 注意 p1, p2本身是在栈中的
  • 7. strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的“123456” 优化成一个地方。 free(p1); free(p2); 释放堆空间 }
  • 8. 三、堆和栈的理论知识3.1、申请方式 栈区(stack) 由系统自动分配 堆区(heap) 需要程序员自己申请,并指明大小。 在C中malloc函数,在C++中用new运算符
  • 9. 3.2、申请后系统的响应 栈区(stack):只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆区(heap): 记录空闲内存地址的链表 遍历该链表 大于所申请空间的堆结点 该结点的空间分配给程序
  • 10. 3.3 申请大小的限制 栈区(stack) 栈是向低地址扩展的数据结构,是一块连续的内存区域 栈顶的地址和栈的最大容量是系统预先规定 申请的空间超过栈的剩余空间,溢出 堆区(heap) 堆是向高地址扩展的数据结构,是不连续的内存区域 受限于计算机系统中有效的虚拟内存
  • 11. 3.4堆和栈中的存储方式 (1).栈区(stack) 进栈:主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址参数(由右往左入栈的)函数中的局部变量(注意静态变量是不入栈的) 出栈 :局部变量参数主函数中的下一条指令 (2).堆区(heap) 在堆的头部用一个字节存放堆的大小 由程序员安排
  • 12. 四、小结:栈和堆的区别(1)管理方式不同 (2)空间大小不同 (3)是否产生碎片 (4)增长方向不同 (5)分配方式不同 (6)分配效率不同