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

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

3天内不再提示

C程序中栈空间的使用

单片机匠人 来源:单片机匠人 作者:单片机匠人 2022-04-19 14:41 次阅读

C语言程序中,栈空间是由编译器管理的,在程序中可以体现栈空间使用的例子是参数的传递、返回值的使用以及自动变量的空间。

在运行程序的系统中,栈空间是从高地址向低地址增长的。在程序的执行结果中打印参数的地址就可以看到参数地址的关系。

参数入栈的顺序是:后面的参数在高地址处,前面的参数在低地址处。事实上,进入函数后,第一个参数将位于栈空间的最后。因此,程序在按照顺序访问参数的时候,还是从低地址到高地址的访问。注意:具体参数将占用多大的栈区域空间,将由编译器决定,因为入栈之前的栈指针和入栈之后的栈指针之间的内容不一定和参数大小的和一致。

在函数退出之后,栈指针将返回到函数进入之前的位置。从上面我们得出,在函数调用的过程中,每增加一个层次,都会让程序需要更大的栈空间。

事实上,在函数的调用过程中,参数和返回值都将使用栈空间。栈空间的具体规模是和编译器有关系的,可以确定的一点是:一般参数入栈后,前面的参数将位于内存的低地址,后面的参数将位于内存的高地址。

在程序中,函数内部使用的自动变量也是保存在栈区域的。编译器在处理自动变量的时候,将在参数栈区的后面为自动变量分配栈区域。栈的开辟顺序和参数的顺序是一致的。

编译器只会为函数内部的自动变量在栈上开辟空间,如果函数内部的变量改为静态变量,这个时候编译器就不会为这个变量在栈上开辟空间了,而是将它放入静态的存储区内。

程序中使用的自动局部变量和参数的类型都是C语言的基本类型,在32位的系统中,int为32位(4字节),这种变量类型将占用4个字节的栈空间。在程序中,可能使用较大的栈空间的变量类型是结构体和数组。

关于栈空间的使用,完全是由编译器来处理的,在程序中不需要管理栈。当函数退出之后,函数栈上的内容将被释放,因此,在函数跳出后,函数栈上的内容是不能被别的函数使用的。

内层函数可以使用外层函数的栈内存,但是外层函数不能使用内层函数的栈内存。

自动变量的地址不可以作为函数返回值,但是可以作为参数传递给其他函数。

审核编辑 :李倩

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

    关注

    3

    文章

    3904

    浏览量

    61310
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48627
  • C程序
    +关注

    关注

    4

    文章

    253

    浏览量

    35750

原文标题:C程序中栈空间的使用

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

收藏 人收藏

    评论

    相关推荐

    STM32启动文件大小根据什么设置的呢?

    大神们,STM32启动文件大小根据什么设置的呢?我每次都是设置一个大概,但是这样总感觉不安全有没有高手指点一二,感激不尽。
    发表于 04-24 08:01

    调整PWM占空比值时硬件错误HardFault_Handler的原因?

    BootLoad和APP两个部分,如果单独只烧录APP程序(更改起始地址),程序可以正常运行,给入任何占空比程序工作正常; 2、更改PWM输出通道,程序运行正常; 3、减小单片机启动文
    发表于 03-25 06:49

    STM32H743如何让malloc自动分配到外部RAM呢?

    本人试过在进入main之前修改启动文件,增加SDRAM的初始化,并且将空间指定在内部防止初始化错误,程序还是死在Hardfault_Handler。还有什么办法可以将malloc自动分配到外部RAM
    发表于 03-13 07:14

    请问在C51如何访问各空间某个确定地址单元?

    C51如何访问各空间某个确定地址单元?
    发表于 10-31 06:07

    STM32内部EEPROM的使用方法

    STM32内部的EEPROM其实是Flash模拟的,也就是会占用程序的存储空间,下载的程序也放在这个地方,不过L系列单独给eeprom分配的有位置,理论上所有的STM32都可以使用这个方法,但是要注意
    的头像 发表于 10-23 17:04 2070次阅读
    STM32内部EEPROM的使用方法

    SPI在通信的过程是用什么来区别主和从的?

    SPI在通信的过程是用什么来区别主和从
    发表于 10-10 07:15

    软件的堆栈,堆和是不同的东西吗?

    堆区和区有什么不同的地方
    发表于 10-10 07:12

    IIC协议是怎么确定主和从的?

    是通过什么方式来判断一个设备是主还是从
    发表于 10-10 06:01

    Linux操作系统中程序地址空间详解

    在正式讲程序[地址空间]前我们先来看一段简单的代码来分析分析。
    发表于 09-12 10:56 132次阅读
    Linux操作系统中<b class='flag-5'>程序</b>地址<b class='flag-5'>空间</b>详解

    将8051C程序移植到251

    IDATA、PDATA、CODE和XDATA映射到效率较低的251条指令。 如果您将这些内存空间替换为接近内存空间的新C251,则可以从251CPU获得最佳性能。
    发表于 09-04 06:56

    Sample Code to Load and Call Function in SRAM修改源程序时函数占用的空间很大是为什么?

    空间很大。*/远远大于0c。 这时候再调用修改之后的函数,在porthelper 上会提示硬件错误。 当我把可调用函数函数体清空,发现所占空间远小于0c,这个时候可以正常调用。
    发表于 08-31 08:23

    32位低功耗DT5M1226系列特性介绍

        fuse烧断后,程序空间和RAM的空间都不能访问     fuse烧断后,SWD通信中断,但按特定模式可把整个程序空间擦除,  
    的头像 发表于 08-15 13:03 272次阅读

    IAR如何设置LDROM为程序存储空间

    IAR如何设置LDROM为程序存储空间
    发表于 06-19 11:31

    XL2402无线收发芯片,2.4G SOC 芯片。性能优异,抗干扰性好

     PIC16-like 指令集  8 层硬件堆栈 x11bit  2T 或 4T 指令周期  2Kx14b 程序存储空间(16bytes/page)
    的头像 发表于 06-16 19:00 481次阅读

    FP6296XR-G1 10A电流模式非同步PWM增压转换器

    补偿网络使系统稳定方便灵活。FP6296可在SOP-8L(EP)软件包中使用,以适合用于应用程序领域的节省空间的PCB。
    的头像 发表于 05-22 10:03 777次阅读
    FP6296XR-G1 10A电流模式非同步PWM增压转换器