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

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

3天内不再提示

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

电子工程师 来源:单片机匠人 作者:蔡琰老师 2021-06-29 10:34 次阅读

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编辑:jq

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

    关注

    180

    文章

    7589

    浏览量

    135765
  • 程序
    +关注

    关注

    116

    文章

    3753

    浏览量

    80720

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

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

收藏 人收藏

    评论

    相关推荐

    你知道吗? 51单片机也有动态内存分配

    一、简述其实在51单片机也可以使用动态内存动态内存其实就是划出一块内存区域,将这块内存进行管
    的头像 发表于 04-26 08:10 1291次阅读
    你知道吗? 51单片机也有<b class='flag-5'>动态内存</b>分配

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,内存不存在内存泄漏问题,因为
    发表于 03-19 11:38 433次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>泄漏问题原理

    C语言的指针用法

    C语言编程善用指针可以简化一些任务的处理,而对于一些任务(比如动态内存分配),必须要有指针才行的。也就是说精通C指针编程是很有必要的,帮助
    发表于 03-05 14:22 300次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的指针用法

    C语言中的动态内存管理讲解

    本章将讲解 C 动态内存管理。C 语言内存的分配和管理提供了几个函数。这些函数可以在
    的头像 发表于 02-23 14:03 355次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的<b class='flag-5'>动态内存</b>管理讲解

    FreeRTOS内存机制详解

    FreeRTOS是一种实时操作系统,它提供了多种内存分配方式,包括动态内存分配和静态内存分配。
    的头像 发表于 12-31 16:49 2424次阅读
    FreeRTOS<b class='flag-5'>内存</b>机制详解

    jvm配置堆内存初始值参数

    JVM(Java Virtual Machine)是Java语言的运行环境,它通过解释字节码并执行相应的指令来运行Java程序。在JVM,堆(Heap)是用于存储对象实例的内存
    的头像 发表于 12-05 14:17 704次阅读

    java虚拟机内存包括远空间内存

    Java虚拟机(JVM)内存是Java程序执行时所使用的内存空间的总称,包括了Java堆、方法区、本地方法、虚拟机
    的头像 发表于 12-05 14:15 359次阅读

    jvm内存区域中,哪一块是属于线程共享

    是如何划分的。JVM内存区域主要分为以下几个部分:程序计数器、Java虚拟机、本地方法、堆、方法区和运行时常量池。其中,
    的头像 发表于 12-05 14:14 1272次阅读

    jvm内存区域由哪几部分组成

    JVM(Java Virtual Machine)是Java程序运行的环境,在JVM存在着多个不同功能的内存区域。这些内存
    的头像 发表于 12-05 14:10 754次阅读

    jvm运行时内存区域划分

    JVM是Java Virtual Machine(Java虚拟机)的缩写,它是Java编程语言的运行环境。JVM的主要功能是将Java源代码转换为机器代码,并且在运行时管理Java程序内存。JVM
    的头像 发表于 12-05 14:08 482次阅读

    jvm内存模型和内存结构

    JVM(Java虚拟机)是Java程序的运行平台,它负责将Java程序转换成机器码并在计算机上执行。在JVM内存模型和内存结构是两个重要
    的头像 发表于 12-05 11:08 818次阅读

    如何查看java程序内存分布

    要查看Java程序内存分布,首先需要了解Java程序运行时的内存模型。 Java程序内存分布
    的头像 发表于 11-23 14:47 980次阅读

    内存是如何泄露的

    是如何泄露的 在 C++ 程序,主要涉及到的内存就是『』和『堆』(其他部分不在本文中介绍了)。 通常来说,一个线程的
    的头像 发表于 11-13 14:13 389次阅读
    <b class='flag-5'>内存</b>是如何泄露的

    glibc的内存分配回收策略

    从上到下依次为stack(向下增长)、mmap(匿名文件映射区)、Heap堆(向上增长)、bss数据段、数据段、只读代码段。 其中,Heap区是程序动态内存区,同时也是C++
    的头像 发表于 11-13 11:16 608次阅读
    glibc的<b class='flag-5'>内存</b>分配回收策略

    程序内存分区的堆与

    堆(Heap)与(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与代表不同的含义。一般情况下,有两层含义: (1)
    的头像 发表于 11-11 16:21 709次阅读
    <b class='flag-5'>程序</b><b class='flag-5'>内存</b>分区<b class='flag-5'>中</b>的堆与<b class='flag-5'>栈</b>