0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言程序的动态内存中栈内存区域的概念

电子工程师 ? 来源:单片机匠人 ? 作者:蔡琰老师 ? 2021-06-29 10:34 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

C语言程序的动态内存分为栈内存区域和堆内存区域两种。栈内存是由编译器管理的,而堆内存是由程序调用具体的库函数管理的。我们今天分析下栈内存的概念。

栈内存的使用在很大程度上依赖于处理器的硬件机制。在处理器中,一般有一个寄存器来表示当前栈指针的位置,通常在内存中分配一块区域,这块内存的上界(高内存地址)和下界(低内存地址)之间是可用的栈内存区域。

栈指针是一个指向栈区域内部的指针,也就是它的值是一个地址,这个地址位于栈区的下界和栈区的上界之间。栈指针把这个栈区域分为两个部分,一个是已经使用的区域,一个是没有使用的区域。

对于栈内存的增长方向有两种:一种是向上增长的,也就是低地址向高地址增长;另一个是向下增长的,高地址向低地址增长。在目前常见的体系结构和编译系统中,栈大多是向下增长的,我们也是看下这种常见的增长形式。在初始阶段,栈指针是指向栈区间的上界。随着栈使用量的增加,栈指针的值将向低地址移动,也就是在变小。

栈内存在使用过程中有一个重要的特性是先入后出,也就是后入栈的内容将先出栈,而先入栈的后出栈。类似于一个口的瓶子,先进去的在底下,要想底下的出来就先把上面的先倒出来。

入栈的过程和出栈的过程我们安全用图形来表示,更形象些吧~

在入栈的过程中,如果栈指针的变化超出栈内存的区域,将发生栈溢出。

从图中看出栈指针的功能是标识当前的栈位置。对栈内存处理中,每次能够获取的内容都是最后可放入栈内存的内容,而每次放入栈内存中的内容都将位于栈区域的最后。

总的来说其实栈是一个先入后出的内存区域,栈指针是提供一种硬件的内存机制。

还有一个大家可能都没听说过,或者都没关注过的,我们来一起了解一下,就是满栈和空栈的概念,我们还是通过图来形容一下,这个是由处理器的体系结构决定的。与程序的编写没有关系,甚至编译器都不需要关注这个问题。无论在哪种情况下,栈指针都是已经使用的栈区域和未使用的栈区域的分界线。

在满栈的情况:栈指针当前的位置是已经使用的栈区域。

在空栈的情况:栈指针当期的位置是没有使用的栈区域。

这个仅供大家了解下就可以了,毕竟对于我们大多数人来说都是应用者,多了解点底层的总没错,但也不必太深挖。对于栈内存的概念我就分享到这里,其实这个对于写汇编的人来说就很有用处了,或者去多读一些汇编就很能清楚栈内存的妙用了。

后续我分享堆内存的一些概念,话说知识是一点点积累的过程,有时候觉得前面有的知识点懵懵懂懂的突然连起来就又通透了。这就是坚持学习的作用,希望大家都能坚持多学,才能更会用。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7633

    浏览量

    142139
  • 程序
    +关注

    关注

    117

    文章

    3827

    浏览量

    83192

原文标题:C语言中的动态内存-----栈内存

文章出处:【微信号:gh_e7f294a514ca,微信公众号:单片机匠人】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    IEC61508系统动态内存使用

    IEC 61508标准强烈推荐使用静态内存管理方式。在安全应用设计,我们都在遵循这个建议。
    的头像 发表于 04-11 15:17 ?971次阅读
    IEC61508系统<b class='flag-5'>中</b>的<b class='flag-5'>动态内存</b>使用

    如何使用LAX_CODEGEN启用动态内存分配?

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代码基于静态分配。我想管理大型向量,如何使用 LAX_CODEGEN 启用动态内存分配?
    发表于 04-10 08:09

    快速搞懂C语言程序内存分区!

    程序运行过程,操作系统会根据程序的需要,将内存划分为多个功能不同的区段,以便更高效地管理内存资源和确保
    的头像 发表于 03-14 17:37 ?748次阅读
    快速搞懂<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>程序</b><b class='flag-5'>内存</b>分区!

    EE-62:在C语言中访问短字内存

    电子发烧友网站提供《EE-62:在C语言中访问短字内存.pdf》资料免费下载
    发表于 01-07 14:02 ?0次下载
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>语言</b>中访问短字<b class='flag-5'>内存</b>

    虚拟内存溢出该怎么处理 虚拟内存在服务器的应用

    在现代计算机系统,虚拟内存是一种重要的资源管理技术,它允许系统使用硬盘空间来扩展物理内存的容量。然而,当系统运行的程序和进程超出了物理内存
    的头像 发表于 12-04 09:49 ?916次阅读

    虚拟内存对计算机性能的影响

    在现代计算机系统内存管理是确保系统高效运行的关键因素之一。虚拟内存技术作为内存管理的核心组成部分,对于提升计算机性能和用户体验起着至关重要的作用。 一、虚拟
    的头像 发表于 12-04 09:17 ?3626次阅读

    什么是虚拟内存分页 Windows系统虚拟内存优化方法

    虚拟内存分页概述 在Windows操作系统,虚拟内存是通过分页机制实现的。分页允许系统将内存的数据移动到硬盘上,以便为当前运行的
    的头像 发表于 12-04 09:16 ?1548次阅读

    虚拟内存的作用和原理 如何调整虚拟内存设置

    虚拟内存,也称为虚拟内存管理或页面文件,是计算机操作系统的一种内存管理技术。它允许系统使用硬盘空间作为额外的RAM(随机存取存储器),以弥补物理
    的头像 发表于 12-04 09:13 ?2927次阅读

    C语言中申请的堆内存能不能自动释放

    C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。 学过 C++ 的同学,应该首先能想到智能指针。 但是这是C
    的头像 发表于 11-27 09:33 ?568次阅读

    解读版|Air780E软件C语言内存数组的神秘面纱!

    今天我们来揭开Air780E 软件 C 语言内存数组的神秘面纱,希望有所收获。
    的头像 发表于 11-17 10:00 ?692次阅读
    解读版|Air780E软件<b class='flag-5'>中</b><b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>数组的神秘面纱!

    逻辑内存和物理内存的区别

    逻辑内存和物理内存是计算机系统两个重要的概念,它们在计算机的运行和数据处理起着至关重要的作用。 1. 物理
    的头像 发表于 09-27 15:38 ?1912次阅读

    内存时钟和内存条有什么不同

    在探讨内存时钟(Memory Clock)和内存条(Memory Module)的不同时,我们首先需要明确这两个概念的基本定义和它们在计算机系统的角色。以下是对这两个
    的头像 发表于 09-04 11:45 ?3737次阅读

    反射内存卡原理说明

    区域,多个连接到网络的节点都可以访问这个区域。当一个节点向其本地的反射内存写入数据时,该数据会被迅速广播到网络的其他节点。数据广播机制通过高速的通信介质(如光纤)
    的头像 发表于 09-04 10:19 ?798次阅读
    反射<b class='flag-5'>内存</b>卡原理说明

    如何自定义内存控制器的设置

    策略都有其特定的使用场景和优缺点。以下是一些步骤和建议,用于自定义内存控制器的设置: 1. 选择合适的内存分配策略 heap_1 :最简单的内存分配策略,但分配的内存不允许释放。适用于
    的头像 发表于 09-02 14:28 ?976次阅读

    堆栈和内存的基本知识

    本文主要聊聊关于堆栈的内容。包括堆栈和内存的基本知识。常见和堆栈相关的 bug,如溢出,内存泄漏,堆内存分配失败等。后面介绍软件堆栈统计
    的头像 发表于 08-29 14:10 ?1082次阅读
    堆栈和<b class='flag-5'>内存</b>的基本知识