本文为转载,由孙晓明老师所编写,放在我的博客里面主要是为了自己学习方便。

栈(stack):是自动分配变量,以及函数调用所使用的一些空间(所谓的局部变量),地址由高向低减少; 
堆(heap):由malloc,new等分配的空间的地址,地址由低向高增长。

看看下面一段代码:

#include <iostream> 
using namespace std; 
            void main() 
            { 
            int a;  
            int b; 
            int *p1 
            int *p2;  
            cout << &a << endl << &b << endl << &p1 << endl << &p2 << endl ;  
            //结果显示:0012FF7C,0012FF78,0012FF74,0012FF70;可见,栈中的地址是减少的 
            int *p3=new int[1];  
            int *p4=new int[1]; 
            cout<<p3<<endl<<p4<<endl; 
            //结果显示:003907A8,003907E0;可见,堆中地址是增加的  
            }

有一点应该注意:频繁使用heap 会产生内存碎片,而按照堆栈的先入后出原则,即先申请的后释放原则可以有效地避免在堆中产生碎片。 
栈区中的局部数据占有的空间在函数结束后会自动释放,而堆中的要由程序员手动释放。

堆和栈中的存储内容

Stack栈: 在函数调用时,第一个进栈的是主函数中  函数调用语句的下一条可执行语句的地址,然后是函数的各个参数,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。   
heap堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

程序的内存分配

一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。与数据结构栈类似

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。

3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区(text)—存放函数体的二进制代码。

引用的一个例子: 
            //main.cpp  
            int a = 0; //全局初始化区 
            char *p1; //全局未初始化区  
            main()  
            { 
            int b; //栈  
            char s[] = "abc"; //栈 
            char *p2; //栈  
            char *p3 = "123456"; //123456\0在常量区,p3在栈上。 
            static int c = 0; //全局(静态)初始化区 
            p1 = (char *)malloc(10); 
            p2 = (char *)malloc(20);  
            //分配得来得10和20字节的区域就在堆区。 
            strcpy(p1, "123456");   
            //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。 
            }

原文链接地址: http://mayer.spaces.eepw.com.cn/articles/article/item/64846

程序运行时堆区和栈区的分配相关推荐

  1. Java运行时数据区及对象的分配

    一.Java运行时数据区 简图: 简述: 堆.方法区是线程共享的,虚拟机栈.程序计数器.本地方法栈是线程私有的,一个线程一份. 虚拟机栈的基本单位是栈帧,一个方法的开始执行意味着一个栈帧进栈,一个方法 ...

  2. 程序运行时的存储组织及管理

    目录 程序运行时的存储组织及管理概述 静态存储分配 临时变量的地址分配 简单栈式动态存储 嵌套过程语言的栈式实现 display 表方法 存取链(静态链)方法 参数传递 程序运行时的存储组织及管理概述 ...

  3. JVM运行时数据区和各个区域的作用

    一.JVM主要分为5个核心区域(6个子区域),分别是: 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 *运行时常量池(属于"方法区"的一部分) 二.各个区域作用和描 ...

  4. 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系

    参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...

  5. jvm运行时数据区是干啥的?CPU切换线程会不会突然忘记程序执行到哪一步了

    目录 还是那张JVM总体图 线程 程序计数器(PC寄存器) 使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢? PC寄存器为什么会被设定为线程私有? CPU时间 ...

  6. 1、虚拟机内存管理、运行时数据区、线程共享区、Java堆、新生代、老年代、Eden区域分配、方法区、线程独占区、虚拟机栈

    1.Java虚拟机内存管理 1.1.运行时数据区[Runtime Data Area] 1.1.1.线程共享区 1.1.1.1.Java堆[heap] 1.1.1.1.1.新生代.老年代.Eden区域 ...

  7. 以独占方式锁定此配置文件失败.另一个正在运行_JVM深入解析:运行时数据区+HotSpot+JMM+堆+GC+JVM优化+类加载

    Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用 ...

  8. 四.运行时数据区-本地方法栈(Native Method Stack)-堆-方法区

    1. 前言:本地方法接口 1.1 本地方法 简单来讲,一个Native Method就是一个java调用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非J ...

  9. Java程序员必知必会之JVM运行时数据区

    JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...

最新文章

  1. Jenkins 在 Kubernetes 上的实践
  2. EBS报表 查看输出 FNDWRR.exe
  3. tomcat需要设置环境变量吗
  4. JdbcTemplate中的query方法(代码)
  5. MySQL使用用户变量需确定取值的顺序
  6. kafka集群安全化之启用kerberos与acl
  7. Word中如何设置图片与段落的间距为半行
  8. java平台调试架构JPDA
  9. SQL联合主键 查重
  10. FPGA时序约束设计经验总结
  11. 挖掘经典:几乎被人遗忘的HTML七种用法
  12. 千万级数据清洗ETL设计方案
  13. 计算机存储数据时2的20次方,2的20次方是多少
  14. 《 Kubebuilder v2 使用指南 》-P1-总览篇
  15. Lua+Redis+OpenResty实现电商详情页
  16. H5+CSS初级试题
  17. 虚拟机环境安装 | 查看修改主机名
  18. 2017江苏高职计算机分数线,2017—2019江苏高考招生投档分数线(体育高职专科院校).docx...
  19. Kubernetes 1.14:Windows节点的生产级支持、Kubectl更新、持久本地卷GA
  20. SAP客户端多语言设置

热门文章

  1. docker配置国内镜像
  2. Java Error(三)
  3. java中日期与字符串之间的转换
  4. js中父窗口获得模态窗口的返回值
  5. Random方法:生成指定长度的随机数字
  6. [基础题] 6.(*)按如下要求编写Java程序: (1)编写一个接口:OneToN,只含有一个方法int dispose(int n)
  7. Windows下安装并设置Redis
  8. 操作系统实验报告12:线程2
  9. Swift之Codable自定义解析将任意数据类型解析为想要的类型
  10. iOS之深入解析事件传递的响应链