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

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

3天内不再提示

C程序中栈空间的使用

单片机匠人 来源:单片机匠人 作者:单片机匠人 2022-04-19 14:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

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

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

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

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

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

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

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

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

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

审核编辑 :李倩

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

    关注

    3

    文章

    4406

    浏览量

    66855
  • 编译器
    +关注

    关注

    1

    文章

    1670

    浏览量

    51084
  • C程序
    +关注

    关注

    4

    文章

    255

    浏览量

    37427

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    EtherCAT主站协议EC-Master在ROS(机器人操作系统)的应用

    EtherCAT主站协议EC-Master在ROS(机器人操作系统)的应用
    的头像 发表于 12-10 14:46 74次阅读
    EtherCAT主站协议<b class='flag-5'>栈</b>EC-Master在ROS(机器人操作系统)<b class='flag-5'>中</b>的应用

    Stack到底用来干嘛的呢?

    我们在函数的局部变量、数组这些不能超过1K(含嵌套的函数),否则程序就会崩溃进入hardfaul。 除了这些局部变量以外,还有一些实时操作系统的现场保护、返回地址都是存储在里面。 还有一点题外话,就是的增长方向是从高地址到低
    发表于 12-01 08:04

    堆和的区别

    一个由C/C 编译的程序占用的内存分为以下几个部分: 区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构
    的头像 发表于 11-27 18:13 912次阅读

    C语言程序的结构

    ,87LPC764有4KB的Flash ROM,而笔者的程序量只有2KB多点,因而第一个想法是改用C语言作为主要的开发语言,应该不至于导致代码空间不够用。其次,考虑到需要定时功能的模块(或称任务,以下统称任务
    发表于 11-26 08:12

    在Keil5查看大小

    1、修改启动文件: 方法说明:大小通常在启动文件定义。可以通过直接修改这个文件的Stack_Size变量来调整大小。 操作步骤:找到对应的启动文件,定位到Stack_Size的
    发表于 11-14 06:32

    如何在应用程序调试期间分析和堆使用情况

    ,并在 Unified IDE 仍可使用。本文涵盖了如何在 Vitis 中使用分析工具在应用程序调试期间对和堆进行监控。
    的头像 发表于 10-24 16:54 599次阅读
    如何在应用<b class='flag-5'>程序</b>调试期间分析<b class='flag-5'>栈</b>和堆使用情况

    使用RT-Thread Studio在程序进Hardfault时怎么方便的查看调用

    求助各位大神 使用RT-Thread Studio在程序进Hardfault时怎么方便的查看调用 使用MDK的时候可以方便的看调用堆栈,从而很快速的找到问题,使用RT-Thread Studio该如何快速找到问题呢
    发表于 10-10 06:54

    自动驾驶中常提的“全”是个啥?有必要“全”吗?

    和应用,涵盖从底层硬件、感知算法、高精地图、定位与融合,到决策规划、控制执行、软件平台,乃至整车集成与云端服务的完整链条。对于希望在激烈的市场竞争占据一席之地的车企和科技公司来说,全似乎代表了掌握核心竞争
    的头像 发表于 08-27 09:43 667次阅读
    自动驾驶中常提的“全<b class='flag-5'>栈</b>”是个啥?有必要“全<b class='flag-5'>栈</b>”吗?

    C语言的历史及程序介绍

    电子发烧友网站提供《C语言的历史及程序介绍.pdf》资料免费下载
    发表于 04-09 16:10 0次下载

    使用RT-Thread Studio在程序进Hardfault时怎么方便的查看调用

    使用RT-Thread Studio在程序进Hardfault时怎么方便的查看调用 使用MDK的时候可以方便的看调用堆栈,从而很快速的找到问题,使用RT-Thread Studio该如何快速找到问题呢
    发表于 04-01 07:32

    如何在 树莓派 上编写和运行 C 语言程序

    在本教程,我将讨论C编程语言是什么,C编程的用途,以及如何在RaspberryPi上编写和运行C程序。本文的目的是为您介绍在Raspber
    的头像 发表于 03-25 09:28 943次阅读
    如何在 树莓派 上编写和运行 <b class='flag-5'>C</b> 语言<b class='flag-5'>程序</b>?

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之获取内核空间数据

    $ $CC\\ copy_to_user.c -o copy_to_user 将编译好的应用程序拷贝到开发板。 测试 root@ELF1:~# insmod copy_to_user.ko major
    发表于 03-21 14:00

    快速搞懂C语言程序内存分区!

    程序运行过程,操作系统会根据程序的需要,将内存划分为多个功能不同的区段,以便更高效地管理内存资源和确保程序的稳定运行。不同的内存区段负责存储不同类型的数据和代码,涵盖了从
    的头像 发表于 03-14 17:37 1342次阅读
    快速搞懂<b class='flag-5'>C</b>语言<b class='flag-5'>程序</b>内存分区!

    请问使用RT-Thread Studio在程序进Hardfault时怎么方便查看调用

    求助各位大神 使用RT-Thread Studio在程序进Hardfault时怎么方便的查看调用 使用MDK的时候可以方便的看调用堆栈,从而很快速的找到问题,使用RT-Thread Studio该如何快速找到问题呢
    发表于 03-03 08:10

    KT142C语音芯片内置的320Kbyte空间不够,还有其他方案吗?

    这里详细描述一下,为什么是320Kbyte 因为KT142C芯片内置空间实际是512K,其中有一部分是拿来存储程序固件,还有一部分作为记忆存储空间,剩下的
    的头像 发表于 02-19 10:24 858次阅读
    KT142<b class='flag-5'>C</b>语音芯片内置的320Kbyte<b class='flag-5'>空间</b>不够,还有其他方案吗?