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

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

3天内不再提示

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编辑:jq

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

    关注

    180

    文章

    7533

    浏览量

    128795
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79550

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    C语言内存泄漏问题原理

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

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

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

    FreeRTOS内存机制详解

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

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

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

    jvm运行时内存区域划分

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

    glibc的内存分配回收策略

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

    DMA开辟缓存怎么使用动态内存

    开辟20kb左右的缓存空间,如果直接用全局变量数组,在不需要用到DMA时,那这20k的内存就一直不能释放,好浪费。若使用malloc来开辟动态内存,应该是放在堆区吧?堆区不是默认只有512字节?还要修改启动文件的堆大小?
    发表于 10-23 06:53

    51单片机能实现动态内存管理吗?

    怎么用51单片机实现动态内存管理
    发表于 10-15 12:43

    嵌入式系统动态内存的使用技巧

    一种比较好的方法是建立日志块,即每次分配内存时记录该内存块的指针和大小,释放时再去除该日志块,如果有内存泄露就会有对应的日志块记录这些内存没有释放,这样就可以提醒
    发表于 10-12 15:22 139次阅读

    RT-Thread使用经验分享:动态申请的内存未清零造成死机

    最近在开发调试基于RT-Thread 的程序时,遇到一个比较奇怪的死机问题,后来经过一步步排查,终于发现是动态内存申请的数据结构没有清零引发的死机。
    的头像 发表于 10-08 14:59 508次阅读
    RT-Thread使用经验分享:<b class='flag-5'>动态</b>申请的<b class='flag-5'>内存</b>未清零造成死机

    C语言程序设计中动态内存分配如何实现

    C语言程序设计中,动态内存分配如何实现,需要注意哪些问题?
    发表于 09-28 16:53 852次阅读

    C语言中的动态内存管理知识

    概述:C语言的优势是可以直接访问内存地址,也就是指针操作,但其缺陷也是因为直接内存访问。如何通过防御性编程提前发现问题,尽可能减少内存异常产生的后果,就是本文的重点。
    发表于 09-22 09:54 195次阅读
    C<b class='flag-5'>语言</b>中的<b class='flag-5'>动态内存</b>管理知识

    使用C语言实现简单动态内存分配

    首先要明白为何需要动态内存分配,熟悉C语言的读者应该对这个比较熟悉,需要一段内存时会使用malloc函数来申请所需要大小的内存,函数返回一段内存
    发表于 07-28 16:26 391次阅读
    使用C<b class='flag-5'>语言</b>实现简单<b class='flag-5'>动态内存</b>分配

    C语言内存问题如何解决

    。 踩内存,轻则导致功能异常,重则导致程序崩溃死机。 内存,粗略地分: 静态存储区 动态存储区 存储于相同存储区的变量才有互踩内存的可能。
    的头像 发表于 06-22 11:37 264次阅读
    C<b class='flag-5'>语言</b><b class='flag-5'>内存</b>问题如何解决