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

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

3天内不再提示

C程序中栈空间的使用

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

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

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

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

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

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

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

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

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

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

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

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

审核编辑 :李倩

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

    关注

    3

    文章

    4298

    浏览量

    62348
  • 编译器
    +关注

    关注

    1

    文章

    1617

    浏览量

    49021
  • C程序
    +关注

    关注

    4

    文章

    254

    浏览量

    35976

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    Linux网络协议的实现

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

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

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

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

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

    C语言内存泄漏问题原理

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

    基于嵌入式OS的LwIP协议

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

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

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

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

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

    运行c程序的基本步骤

    运行C程序的基本步骤可以分为以下四个主要步骤:编写程序、编译程序、链接程序和运行程序。本文将详细
    的头像 发表于 11-27 16:21 5321次阅读

    c程序的运行环境和运行c程序的方法

    C语言是一种通用的、高效的编程语言,被广泛用于系统开发、嵌入式设备以及科学计算等领域。为了正确运行C程序,我们需要了解C程序的运行环境,并掌
    的头像 发表于 11-27 16:00 1984次阅读

    如何把c语言源程序变成应用程序

    C语言源程序转变为应用程序可以分为以下几个步骤:编写源代码、编译、链接和运行。在这篇文章,我将详细介绍这些步骤以及相关的工具和技术。 第一步是编写源代码。在
    的头像 发表于 11-26 09:04 3327次阅读

    c程序的基本结构是什么

    C语言源程序的基本结构是由多个函数组成的。每个程序至少包含一个主函数,也可以包含其他的函数,而这些函数相互之间可以进行相互调用,以完成特定的任务。 一、头文件部分 在一个C语言源
    的头像 发表于 11-24 10:24 2158次阅读

    c语言源程序main函数的位置

    C语言源程序的main函数是程序的入口点,它被认为是C语言程序的起点。在执行
    的头像 发表于 11-24 10:23 2279次阅读

    c语言源程序的基本单位

    个或多个函数组成。每个函数都有一个函数名和一对大括号{},大括号是函数的代码块。函数可以接受一些参数,并且可以返回一个值。函数的代码块包含了一系列的语句,这些语句定义了函数的功能和行为。 一个典型的C语言源
    的头像 发表于 11-24 10:20 1528次阅读

    如何查看java程序的内存分布

    程序计数器: 程序计数器是一块较小的内存空间,它的作用是指示当前线程所执行的字节码指令的行号。在多线程环境下,每个线程都有一个独立的程序计数器,用于记录当前线程执行的字节码指令。
    的头像 发表于 11-23 14:47 992次阅读