C程序内存分布及static变量

C程序内存分布及static变量

    • C语言中程序的内存分布 [🔗1](https://www.cnblogs.com/miaoxiong/p/11021827.html)[🔗2](https://blog.csdn.net/chen1083376511/article/details/54930191)
      • c/c++编译连接后二进制文件的存储
      • 动静态存储方式和存储区
        • 动态存储方式
        • 动态存储区
        • 静态存储方式
        • 静态存储区
    • static修饰[🔗](https://blog.csdn.net/stoic163/article/details/104711574)
      • static修饰的全局变量
      • static修饰的局部变量
      • static修饰的函数
      • 总结
    • 存储说明符[🔗](https://www.cnblogs.com/Natsumeno/p/14499173.html)

C语言中static类型表示“静态”或者“全局”的意思,用来修饰变量函数。经其修饰过的变量或函数作用域存储域会发生变化。

C语言中程序的内存分布 🔗1🔗2

c/c++编译连接后二进制文件的存储

  1. 代码段(text段)-- 可执行指令构成,程序在目标文件或内存中的一部分。通常只读,放置程序突发性的修改。

  2. 已初始化数据段(data段)-- 占程序虚拟地址空间一部分,包含全局变量静态变量(程序负责初始化这些变量)。 不是只读,运行时变量值可以变动。可细分为初始化只读区及初始化可读写区。

    //存储在初始化可读写区
    全局字符串 char s[] = "hello world";
    全局变量   int debug = 1;
    静态变量   static int i = 10; 
    //字符串"hello world"存储在初始化只读区  string指针存储在初始化可读写区
    常量修饰 const char* string  = "hello world";
  3. 未初始化数据段(bss段)-- 段内的数据在程序开始执行之前被内核初始化为0值,通常开始于已初始化数据段的末尾处。段内包含初始化为0的全局变量/静态变量以及源码中未显示进行初始化的变量。

    static int i;
    int j;
  4. 栈(stack) – 栈存储着自动变量以及每次函数调用时保存的信息,自顶向下增长;栈是属于线程的,每一个线程都有一个自己的栈。

  5. 堆(heap)-- 堆空间起始于bss段的末尾,并向高地址处生长。通常用作动态内存分配,通常由malloc realloc free管理,在一个进程中,堆空间被进程内所有的共享库及动态加载模块所共享。

进程运行时的典型内存布局

img

动静态存储方式和存储区

动态存储方式

==程序运行期间根据需要进行动态的分配存储空间的方式。==动态存储变量在程序执行过程中,使用它时才分配存储单元,使用完后立即释放。例如函数的形式参数函数定义时并不分配存储单元,函数调用时才分配。调用结束后立即释放。

动态存储区
  1. 堆和栈
  2. 局部自动变量
  3. 自动变量(未加static声明的局部变量)(3,4??)
  4. 函数调用时的现场保护和返回地址
  5. 动态变量(heap里由new/malloc分配的空间,声明周期到free结束)
静态存储方式

程序编译期间分配固定的存储空间的方式。

在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。全局变量,静态变量等就属于此类存储方式。

静态存储区

包括常量、常变量(const 变量)、静态变量、全局变量等。

static修饰🔗

static修饰的全局变量

在全局变量之前加上关键字static,全局变量被定义为一个全局静态变量

  • 内存中的位置:静态存储区,在整个程序运行期间都都行
  • 初始化:未经初始化的全局静态变量会被程序自动初始化未0(未初始化的自动对象的值是任意的)
  • 作用域:全局静态变量在声明它的文件外是不可见的,从定义之处开始到文件结尾
  • 用处:不会被其他文件访问修改,其他文件可以使用相同名字的变量不会发生冲突

注:static修饰全局变量时,改变了全局变量的作用域(声明它的文件之外是不可见的),不过没有改变它的存放位置,还是在静态存储区中。

static修饰的局部变量

局部变量之前加上关键字static,局部变量被定义未一个局部静态变量

  • 内存中的位置:静态存储区
  • 初始化:未经初始化的局部静态变量会被程序自动初始化为0
  • 作用域:仍未局部作用域,在定义它的函数或语句块从定义开始到函数或语句块结束,作用域结束

注: 特点是用static修饰局部变量改变了其存储位置,从栈中变到了静态存储区,虽然作用域仍然为局部作用域,但是在离开作用域后没有被销毁,仍然存留在内存中,直到程序结束,当该函数被多次调用时可以再次访问,下次函数被调用时,可以访问最近一次被修改后的值。应该是这样哈。

static修饰的函数

在函数返回类型前加static,函数被定义为静态函数。函数的定义和声明默认是extern的静态函数只在声明其的文件中可见,不能被其他文件所用。因此文件内部调用的函数,可以定义为static的,如果有头文件也无需在头文件声明。有h文件和c文件的模块,开放给外部的接口函数才需要在h文件中声明。

  • 用处:其他文件中可以定义相同名字的函数,不会发生冲突,静态函数不能被其他文件所用。

总结

  1. 隐藏
  2. 保持变量内容持久,存储在静态数据区的变量会在程序刚开始运行时完成初始化,也是唯一一次初始化。共有两种变量存在静态存储区:全局变量和静态变量。不过静态变量可以控制可见范围。不过对于对局部变量添加static的修饰则就是为了让他保持仅是局部作用域但是局部作用域出了之后变量不被销毁>。
  3. 默认初始化为0,全局变量也具备这一属性。

存储说明符🔗

四种存储类别:auto register extern static

两种存储期:自动存储期(auto register) 静态存储期(extern static

  • auto:自动存储期变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销(消失)。

  • register:存储在CPU内部,而不是存在内存【需要内存寻址访问】,可以提高效率。该变量作为一个寄存器变量,让该变量的访问速度达到最快。循环中的变量需要被频繁使用时, 可以声明为register类型。

    限制:无法使用&获取变量地址;必须是一个单个值,长度应小于等于整形长度;局部静态变量不能定义为寄存器变量。

  • extern:声明一个全局变量/外部变量, 作用在整个程序工程。定义和声明分开且定义只能一次,声明可以多次。

static与auto

  • 变量在静态存储区被分配存储单元, 在程序运营期间都不释放。 但是auto 自动变量/局部变量, 在动态存储区空间, 函数调用后结束后即释放。
  • 只在编译时赋值一次, 【不赋值则默认为0】。 以后调用函数时不需要再次赋值,而是使用上次函数调用结束的值。 但是,为auto自动变量赋值, 不是在编译时进行赋值,而是在函数调用时进行赋值, 每调用一次,就重新赋一次初值。
  • 不给static变量赋值,默认为0,不给auto变量复制,值不确定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂ipv4和ipv6的区别

IPv4和IPv6是互联网协议的两个主要版本,它们在多个方面存在显著的差异。以下是关于IPv4和IPv6之间区别的详细探讨: 一、地址空间 IPv4使用32位地址,理论上可以表示约42.9亿个不同的地址。然而,由于地址分配的不均衡以及网络技术的…

基于springboot实现智慧图书管理系统项目【项目源码+论文说明】

基于springboot实现智慧图书管理系统演示 摘要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为…

VBA_NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…

企业大文件传输之安全数据传输的重要性

企业数据安全性的维护直接关系到企业的市场竞争力乃至其生存的根基。数据的保护不仅涉及到保护企业的商业秘密,也关乎到客户隐私的保护,更触及到国家安全的敏感层面。因此,保障数据在传输过程中的安全,成为了每个企业和组织必须面…

Linux中的fork与进程地址空间

目录 前言 一、进程地址空间 二、fork的值返回 三、高清图链接 总结 前言 在博主的《进程状态解析》一文中,在讨论进程创建时,提到了一个系统调用接口fork,它在使用过程中表现出对于父子进程不一致的返回结果,而且似乎还具有…

ETL工具kettle(PDI)入门教程,Transform,Mysql->Mysql,Csv->Excel

什么是kettle,kettle的下载,安装和配置:ETL免费工具kettle(PDI),安装和配置-CSDN博客 mysql安装配置:Linux Centos8 Mysql8.3.0安装_linux安装mysql8.3-CSDN博客 1 mysql -> mysql 1.1 mysql CREATE TABLE user_…

618值得入手的平价好物清单,看完再买不吃亏!

即将到来的618年中购物狂欢节,无疑是一年一度的购物盛宴。为了让大家的购物体验更加愉悦和充实,我特地为大家精选了一系列好物。如果你也打算在618尽情购物,那就赶紧收藏这份清单吧! 一、舒适佩戴不伤耳——南卡骨传导耳机Runner…

C补充1—1章1.0—C程序语言设计(许宝文,李志)

二手书到了,好消息,前主人看的很认真,坏消息,只看到这页了 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊最后几题好难啊啊啊啊啊,再议 目录 1.1 入门 1.2 变量与算数表达式 练习1-3 //打印温度对照表 练习1-4 //摄氏-华氏温…

医疗行业如何提升Windows操作系统登录的安全性

医疗行业使用账号和密码登录Windows系统时,可能会遇到一些痛点,这些痛点可能会影响工作效率、数据安全和用户体验。以下是一些主要的痛点: 1. 密码管理复杂性:医疗行业通常涉及大量的敏感数据和隐私信息,因此密码策略…

为什么 Cloudflare 是 2024 年 Vercel 的最佳替代品?生态系统和价格比较

本文探讨了 Vercel 的功能,并与 Cloudflare 生态系统中的类似产品进行了比较。从托管到存储,我们将看到为什么 Cloudflare 可以在 2024 年成为 Vercel 的最佳替代品。 文章目录 介绍什么是 Cloudflare?Cloudflare vs Vercel:托管和…

实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

BS架构 数据权限--字段级权限 设计与实现

一、需求场景 1. 销售发货场景 销售出库单上 有 商品名称、发货数量、单价、总金额 等信息。 销售人员 关注 上述所有信息,但 仓管人员 不需要知道 单价、总金额 信息。 2. 配方、工艺保密 场景 配方研发人员 掌握核心配方, 但 交给车间打样、生产时…

锚索测力计在岩土工程中的应用

随着现代工程建设的快速发展,岩土工程安全问题日益受到人们的关注。岩土工程中的锚索结构,作为保证工程稳定和安全的关键部分,其性能监测和评估显得尤为重要。近年来,锚索测力计作为一种先进的监测工具,在岩土工程安全…

【千帆平台】使用AppBuilder零代码创建应用,然后通过OpenAPI方式调用应用

欢迎来到《小5讲堂》 这是《千帆平台》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言创建API密钥调用文档调用说明API服务域名通信协议字符编码公…

IP报文在设备间传递的封装过程

IP报文传递过程 1、PC1访问PC2报文传递过程1.1、PC1准备数据请求报文封装1.2、PC1准备ARP请求报文1.3、PC2准备ARP响应报文1.4、PC1完成数据请求报文封装 2、PC1访问PC3报文传递过程2.1、PC1准备数据请求报文封装2.2、PC1准备获取网关MAC地址的ARP请求报文2.3、网关准备ARP响应…

复制粘贴插件——clipboard.js的使用

clipboard.js是一款使用简单的粘贴复制插件,它不依赖于Flash或其他框架,在github拥有3万多颗星可见其优秀程度,介绍如何使用它,以备存。 中文文档: clipboard.js 中文文档 - itxst.com 官网网站:https://github.com/…

神经网路与深度学习

1 深度学习简述 机器学习:相当于把公式实现出来了而已。 深度学习: (1)中的特征工程使机器学习更智能。 (2)真正能学什么样的特征才是最合适的。 (3)主要应用于计算机视觉和自然语…

【探索Java编程:从入门到入狱】Day5

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

Python深度学习基于Tensorflow(4)Tensorflow 数据处理和数据可视化

文章目录 构建Tensorflow.data数据集TFRecord数据底层生成TFRecord文件数据读取TFRecord文件数据图像增强 数据可视化 构建Tensorflow.data数据集 tf.data.Dataset表示一串元素(element),其中每个元素包含一个或多个Tensor对象。例如&#xf…

XSS-Labs 靶场通过解析(上)

前言 XSS-Labs靶场是一个专门用于学习和练习跨站脚本攻击(XSS)技术的在线平台。它提供了一系列的实验场景和演示,帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 XSS-Labs靶场的主要特点和功能包括:…