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

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

3天内不再提示

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

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

扫码添加小助手

加入工程师交流群

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编辑:jq

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

    关注

    183

    文章

    7646

    浏览量

    146114
  • 程序
    +关注

    关注

    117

    文章

    3847

    浏览量

    85455

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C++ 11 14 17 20内存管理-指针、智能指针和内存池基础与提升

    大模型在云端吞吐着海量数据,当自动驾驶汽车在毫秒间做出生死决策,我们不得不重新审视支撑这一切数字大厦的基石——C++内存管理。尽管高级语言层出不穷,但在对性能、延迟和资源控制有着极致要求的底层核心领域,
    的头像 发表于 04-20 15:51 502次阅读

    C++与lua联合编程

    对“尾部风险”(小概率但毁灭性的事件)的对冲。在 C++ 与 Lua 的交互,最可怕的尾部风险就是内存泄漏与溢出。 很多初学者在调用 Lua C
    发表于 04-19 16:27

    如何为 S32DS 的特定变量(RAM、闪存、数据闪存)强制使用特定内存区域

    怎么做在代码声明变量所以它们被放置在这些自定义的内存部分? 如果 S32DS 或编译器没有为此提供直接设置,我该如何手动修改链接器脚本定义和保留这些特定的内存
    发表于 04-16 06:52

    MangoTree Halo Ultra「全新PXI」,标配自动纠错内存#

    内存
    芒果树数字
    发布于 :2026年03月06日 15:59:34

    容易造成单片机内存溢出的几个陷阱介绍

    关于程序变量和内存分配,都是需要我们时刻关注的问题。我相信有不少人在这块犯过很多的错误,也可能说明我们基础不够扎实,编写程序的习惯也不够好。 总结一下关于程序的变量和
    发表于 01-23 07:25

    keilc语言动态分配内存

    C程序,通常将内存划分为以下六个区域: (1)内核区域。这块
    发表于 01-21 06:04

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配

    成内核空间和用户空间,32位系统的内核地址空间有低端与高端之分。部分内存可以直接由内核访问,称为低端内存;而内存未被永久映射覆盖的部分称
    发表于 01-16 20:05

    C语言嵌入式系统编程注意事项-内存操作

    技巧。掌握并深入理解关于数据指针、函数指针、动态申请内存、const及volatile关键字等的相关知识,是一个优秀的C语言程序设计师的基本
    发表于 01-04 07:31

    嵌入式C语言中各变量存储位置

    C语言程序,对变量的使用还有以下几点需要注意 1. 体定义的变量通常是在上,不需要在
    发表于 12-25 07:54

    三种类型内存的使用

    自动存储:用于保存局部变量。当函数被调用时,就会创建一个新的自动存储区域,并在函数返回结果时删除。只有返回值会被保留,并被复制到调用它的函数的自动存储。这意味着,返回一个指向局部变量的指针是不安全
    发表于 12-12 06:43

    C语言内存池使用

    C语言内存管理,从来都是一个让人头秃的问题。要想更自由地管理内存,就必须去堆申请,然后还需要考虑何时释放,万一释放不当,或者没有及时释放
    发表于 12-11 07:57

    C语言的编程技巧

    一个成员是一个未知大小的数组,适用于动态分配内存并关联一个可变长度的数组。‌ ‌3、匿名结构体和联合体‌:C语言允许在结构体或联合体定义不
    发表于 11-27 06:46

    为什么单片机很少使用malloc,而PC程序频繁使用呢?

    程序的影响。 操作系统的支持单片机:在许多单片机应用程序运行不依赖于复杂的操作系统,而是基于裸机或轻量级实时操作系统(RTOS)来进行管理。裸机系统往往没有内存管理单元(MMU
    发表于 11-20 06:55

    灵活高效ZBUFF — C内存数据操作库:优化内存管理的利器

    C语言开发,高效的内存管理是提升程序性能的关键。ZBUFF作为一款灵活高效的内存数据操作库,
    的头像 发表于 08-14 18:01 811次阅读
    灵活高效ZBUFF — <b class='flag-5'>C</b><b class='flag-5'>内存</b>数据操作库:优化<b class='flag-5'>内存</b>管理的利器

    灵活高效双引擎驱动:ZBUFF让C语言内存操作更智能!

    高性能系统。 一、ZBUFF核心库常用函数 如果小伙伴们此前没有接触过C语言或者不精通C语言,把ZBUFF核心库当成新库来学习即可,建议先从熟悉相关函数的功能及其参数意义入手。 感兴趣
    的头像 发表于 08-11 13:27 720次阅读
    灵活高效双引擎驱动:ZBUFF让<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>操作更智能!