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

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

3天内不再提示

C程序中栈空间的使用

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

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

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

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

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

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

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

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

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

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

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

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

审核编辑 :李倩

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

    关注

    3

    文章

    4338

    浏览量

    62769
  • 编译器
    +关注

    关注

    1

    文章

    1636

    浏览量

    49175
  • C程序
    +关注

    关注

    4

    文章

    255

    浏览量

    36068

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

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

收藏 人收藏

    评论

    相关推荐

    λ-IO:存储计算下的IO设计

    动机和背景    存储计算存储资源的充分利用。IO是管理存储器的的基本组件,包括设备驱动、块接口层、文件系统,目前一些用户空间IO库(如SPDK)有效降低了延迟,但是io仍然不可或缺。这是因为1
    的头像 发表于 12-02 10:35 224次阅读
    λ-IO:存储计算下的IO<b class='flag-5'>栈</b>设计

    AWTK-WEB 快速入门(1) - C 语言应用程序

    导读AWTK可以使用相同的技术开发各种平台的应用程序。有时我们需要使用Web界面与设备进行交互,本文介绍一下如何使用C语言开发AWTK-WEB应用程序。用AWTKDesigner新建
    的头像 发表于 11-27 11:46 238次阅读
    AWTK-WEB 快速入门(1) - <b class='flag-5'>C</b> 语言应用<b class='flag-5'>程序</b>

    简述大前端技术的渲染原理

    应用开发:Android、iOS、鸿蒙(HarmonyOS)等; •Web前端框架:Vue、React、Angular等; •小程序开发:微信小程序、京东小程序、支付宝小程序等; •跨
    的头像 发表于 11-07 10:11 244次阅读

    使用OpenVINO GenAI API在C++构建AI应用程序

    许多桌面应用程序是使用 C++ 开发的,而将生成式AI(GenAI)功能集成到这些应用程序可能会很具有挑战性,尤其是因为使用像 Hugging Face 这样的 Python 库的复
    的头像 发表于 10-12 09:36 404次阅读
    使用OpenVINO GenAI API在<b class='flag-5'>C</b>++<b class='flag-5'>中</b>构建AI应用<b class='flag-5'>程序</b>

    Linux网络协议的实现

    网络协议是操作系统核心的一个重要组成部分,负责管理网络通信中的数据包处理。在 Linux 操作系统,网络协议(Network Stack)负责实现 TCP/IP 协议簇,处理应用程序
    的头像 发表于 09-10 09:51 331次阅读
    Linux网络协议<b class='flag-5'>栈</b>的实现

    linux驱动程序运行在什么空间

    Linux 驱动程序是操作系统的一部分,负责管理硬件设备与操作系统之间的交互。驱动程序运行在内核空间(Kernel Space),这是操作系统的核心部分,与用户空间(User Spac
    的头像 发表于 08-30 14:37 455次阅读

    技术干货驿站 ▏深入理解C语言:掌握程序结构知识

    在计算机编程的世界C语言被广泛认可为一门强大而高效的编程语言,其简洁的语法和直接的指令使得它成为了许多程序员的首选。了解C语言的程序结构
    的头像 发表于 07-27 08:45 1455次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b>语言:掌握<b class='flag-5'>程序</b>结构知识

    最简单的C程序设计

    电子发烧友网站提供《最简单的C程序设计.pptx》资料免费下载
    发表于 05-28 16:41 10次下载

    请问FW OTA二进制文件是否包含应用程序和BT/程序库?

    你好,先生: 因为英飞凌仍在不断更新 BT 和库。 那么 如果客户在第一个版本中有 OTA 功能。 FW OTA 二进制文件是否包含应用程序和 BT /程序库?
    发表于 05-20 07:28

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

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

    物联数据网关是什么?

    物联数据网关就是物联网智能网关。 物联数据网关是物联网架构的重要组件之一。它是连接物联网设备和云平台的中间设备,负责将物联网设备采集到的数据传输到云平台,并将云平台下发的指令传输给物联网设备
    的头像 发表于 03-29 17:10 335次阅读

    C语言内存泄漏问题原理

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

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

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

    基于嵌入式OS的LwIP协议

    设计通信协议程序,需要具备内存管理、任务管理、进程间通信、信号量、时钟、定时处理等功能,从头开始难度巨大,而且容易出错。
    发表于 02-03 16:19 862次阅读
    基于嵌入式OS的LwIP协议<b class='flag-5'>栈</b>

    堆和的区别和使用注意事项

    堆和是在计算机科学中广泛使用的两种数据结构,它们具有不同的用途和特点。堆和的区别涉及到内存分配、访问方式、数据存储等方面。在使用堆和时,还需要注意一些细节,以确保程序的正确性和效
    的头像 发表于 01-18 17:24 2258次阅读