程序运行时堆区和栈区的分配

C/C++ 程序内存分配,内存中堆和栈使用情况以及函数压栈退栈过程 C/C++程序内存的分配1.内存分配简易图2.程序内存分配具体分析3.内存中栈与堆的区别4.函数压栈退栈的过程 C++程序在运行过程中所占用的内存空间主要分为五个部分: 栈区(stack): 是一种连续储存的数据结构,具有先进后出的性质。由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。 堆区(heap): 是一种非连续的储存数据结... 阅读详情
作者:孙晓明,华清远见嵌入式学院讲师。

  栈(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://www.embedu.org/index.htm提供”


Linux内存管理知识-堆区和栈区(基础篇) 可执行程序在存储时(没有调入到内存)分为3个部分。加上static,则表示此函数只能在当前文件中被调用。 阅读详情

相关推荐

别再只放按钮了!巧用微信小程序‘长按识别’功能,打造无缝加群体验

本文深入探讨了微信小程序'长按识别'功能在社群运营中的创新应用,通过简化加群流程至一步操作,显著提升用户转化率。文章详细解析了技术实现细节、UI/UX设计策略,并对比了与企业微信API的适用场景,为开发者提供打造无缝加群体验的完整解决方案。

weixin_42627853的博客 434

栈和堆

堆和栈是两种内存(RAM)分配的两个统称。 4. 栈比堆要快,因为它存取模式使它可以轻松的分配和重新分配内存。可能有很多种不同的实现方式,但是实现要符合几个基本的概念: Stack: 栈是为执行线程留出的内存空间。 1. 每一个线程都有完全的独立的栈,但是共享堆。 当线程创建的时候分配栈的大小。栈必须是连续的内存块。栈附属于线程,当线程结束时栈被回收。 2. 通常用后进先出(LIF

井底之猿 458

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

嵌入式开发中的堆与栈

关注、星标公众号,直达精彩内容文章内容出处:网路素材整理:李肖遥0.前言堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区中的堆...

李肖遥的专栏 5628

华为P812E光猫补全shell配置PON口模式

终于看到华为企业级的带2.5电口P812E横空出世了,相信很多发烧友也已经将此收入昂中。相信体验的同时,遇到的第一件事情就是配置PON口模式的问题,本文将带发烧基友解锁模式。

GUAIYU的博客 5727

智慧矿山无人机空地一体化解决方案

未来,随着技术的不断进步和应用场景的不断拓展,智慧矿山无人机空地一体化解决方案将在矿业领域发挥更加重要的作用,为矿山的可持续发展提供更加有力的保障。该系统能够实现矿山的全方位、全天候监测与管理,提升矿山生产效率,降低安全风险,并为矿山的可持续发展提供有力支持。智慧矿山无人机空地一体化解决方案是当前矿业领域技术创新的重要方向,旨在通过集成无人机技术、物联网、大数据、人工智能等先进技术,实现矿山的智能化、高效化和安全化运营。在矿山爆破、挖掘等危险作业中,无人机可进行远程监控和指挥,降低人员安全风险。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1109

关于栈 && 堆内存分配

Part1: 程序的内存分配 1、 栈区【函数的参数、局部变量】 由编译器自动分配和释放,存放函数的参数、局部变量等 内存分配是来连续分配的,当申请变量时,编译器自动在其尾部分配一块内存 2、 堆区 [malloc free / new delete] 由程序员分配和释放[malloc free / new delete](需要指明所需内存大小),如果忘记或是没有释放内存,程序结束时可能由...

turboyuan的博客 1001

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2862

程序执行过程中的堆与栈

1.概念 与数据结构中的栈、堆概念不同。 堆:程序执行过程中的堆是可以动态地扩展和搜索的内存空间,不是连续的内存空间。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。当程序调用malloc、new、free之类的库函数时,堆的大小会变化。 栈:与堆不同,栈的地址是从大到小的连续内存空间,栈顶在底地址端。栈

键盘与猴子 2447

概念解析 | 雷达动态范围

这里存在一个动态范围的问题:强雷达发射信号和弱目标反射信号存在非常大的功率差异,比如传统的脉冲多普勒雷达动态范围可达90dB以上。随着上述技术的发展,预计未来十年雷达接收机动态范围将达到120dB以上,届时雷达的监视能力将得到极大增强。简单来说,雷达动态范围越大,表示接收机噪声越低,对强信号过载保护能力越强,就越能检测到弱信号目标。此外,部分新概念雷达对动态范围提出新的需求,如被动雷达动态范围需大于100dB。当前,随着阵列雷达和数字雷达技术的发展,对雷达接收机动态范围提出了更高要求。

NLOS的博客 1051

无法将“choco”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方案

本文主要介绍了无法将“choco”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方案,希望能对使用wIndows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

内存四区、栈区和堆区注意事项

(1)只读:代码区通常是只读的,其原因是防止程序意外修改了它的指t令。(2)共享:代码区通常是共享的(即另外的程序可以调用它),其目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。2、数据区(data)数据区又分为两个小区,分别是:(1)全局初始化数据区/静态数据区(data段)该区包含了在程序中明确被初始化(也可以理解为手动初始化)的全局变量已经初始化的静态变量(包括全局静态变量和t)和常量数据(如字符串常量)。(2)未初始化数据区(bss段)

2502_92355199的博客 650

【Bug已解决】Codex CLI 运行时出现 command not found: codex 解决方案

方案适用场景推荐指数修复 PATH 配置最常见的基础排查方向⭐⭐⭐⭐⭐检查原生二进制完整性PATH 正常但执行仍然异常⭐⭐⭐⭐统一包管理器混用多种包管理器导致混乱⭐⭐⭐⭐确认安装脚本未被跳过CI/CD 或企业策略环境⭐⭐⭐⭐排查网络下载渠道企业内网/受限网络环境⭐⭐⭐需要留意 warning 中是否涉及脚本执行失败、网络超时重试等信息,这类 warning 往往是后续问题的前兆,建议出现明显的下载/网络相关警告时就主动重新安装一次确认。Codex CLI 报。

一键难忘的博客 1万+

rime的数据结构笔记(c语言)--malloc函数【堆区,栈和内存】

我像是山羊立足在陡峭的悬崖 钻研没人玩的技术 就没人能够践踏

rime_neko的博客 6810

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C/C++程序编译后运行时的内存分配

文章转自于:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一、编译时与运行时的内存情况 1.编译时不分配内存 编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误。 2.运行时必分配内存 运行时程序是必须调到“内存”的。因为CPU(其中有多个寄存器)只与内存打交道的。程序在进入实际内存之前要首先分配物理内存。 3.编译过程 只能简单说一下,因为如果.

yelvens的博客 3840

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

栈区和堆区的用法

1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 我的理解是:main函数中有个指针P变量是主函数的局部变量,他是随主函数结束而自动释放的,而其他创建的函数变量是该函数执行完就消失的。老师第一次是在主函数中的变量指向创建函数栈区变量的地址,自然会释放。而第二次是指向创建堆区

qq_44985337的博客 353

C语言程序内存四区——栈区,堆区,全局区,代码区

1. 全局区:全局区比较特殊,里面还分成了全局变量区,静态变量区,常量区。全局变量区用来存放全局变量,静态变量区用来存放带有static修饰的变量(包括静态局部变量和静态全局变量),只要含有static就存在这个区。常量区是用来存放字符常量的,还有const修饰的全局变量的,const 修饰的局部变量不存在这里,别搞混了。全局区存放的一切都是由操作系统管理,等程序结束由操作系统释放。常量区里存放的数据不可更改,就算你用指针也不行,你可能会说const修饰的局部变量都可以用指针改,但是局部变量可不是存放在常量

中华神威的博客 8322

C语言程序内存分配中的堆和栈

(3)未初始化数据区(uninitialized data segment),也称BSS区(block started by symbol)(2)全局初始化数据区/静态数据区(initialized data segment/data segment)明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。分为代码区(text)、数据区(data)和未初始化数据区(bss)代码区、初始化数据区、未初始化数据区、堆区和栈区。(1)代码区(text segment)

StudyWinter的博客 2022

数据区 代码区 栈区 堆区

数据区 代码区 栈区 堆区

qq_43747119的博客 1018

内存四区(代码区,全局区,栈区,堆区)

1.内存分区模型 c++程序运行时,将内存大方向划分为4各区域: 1.存放函数体内的二进制代码,有操作系统管理。 2.全局区:存放全局变量,静态变量以及常量。 3.栈区:由编译器自动分配和释放,存放函数参数,局部变量等 4.堆区:由程序员分配释放,若程序员未释放,则程序结束之后,编译器自动释放。 内存4区的意义: 不同内存释放的数据,赋予不同的生命周期,给我们更大的灵活编程 1.1程序运行前 在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域: 代码区: 存放CPU执行的

gyzyc6的博客 7431
上一篇: FORK()函数的理解
下一篇: linux下的进程通信
michaeljohn671
博客等级 码龄15年 5粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值