c语言笔记 静态数据与ELF程序格式

数据段:

1.全局变量   
2.常量.rodata段
3.已初始化的静态数据(全局变量).data段
4.未初始化的静态数据(static修饰的局部变量).bss段

为什么需要静态数据?

  1. 全局变量 可以在任何文件,函数中使用,数据操作上更加方便。
  2. static修饰的局部变量,在函数中一直保存着,这可以使用static来保存某些重要的数据,使其运算后不消失,以便下次使用的时候。
注意:
  1. 静态数据只会被初始化一次;
  2. 如果静态数据未写初始化的值会默认为0;
  3. 静态数据的生命周期很长,会随着程序的结束才消失;
  4. 被static修饰的局部变量会从运行栈中移动到数据段;
  5. 被static修饰的全局变量变成仅有本文件可见静态数据;
  6. 被static修饰的函数由各文件可见,变成本文件可见的静态函数。

静态局部变量的问题:如果我定义一个全局变量a 然后我又在函数内定义一个局部变量a值,那么我会先使用哪一个a?

在编程中,如果全局变量和局部变量同名,那么在函数内部会优先使用局部变量。也就是说,你在函数内定义的局部变量 a 会遮蔽全局变量 a,函数内使用的将是局部变量 a。
  1. 全局变量:在函数外部定义的变量 a,作用域是全局的,可以在函数外部和内部访问。
  2. 局部变量:在函数内部定义的变量 a,作用域仅限于函数内部。
  3. 优先级:在函数内部,局部变量的优先级高于全局变量。如果函数内部定义了与全局变量同名的局部变量,那么在函数内部会使用局部变量,而不会使用全局变量。

代码段:

  1. 用户代码 .text
  2. 系统初始化代码 .init
程序员的代码,所有的静态数据以及代码编译完之后会在硬盘内放着,那些局部变量,形参,malloc()出来的堆内存,栈内存在我们的硬盘ELF可执行文件里面是没有,栈内存和堆内存都是存放在虚拟内存空间。而虚拟内存里面是数据段和代码段是对硬盘ELF可执行文件里面的数据段和代码段的复制。
也就是硬盘ELF里面的数据段和代码段直接复制到虚拟内存空间。
数据段和代码段都是在编译时编译完成时候就存在的。不是运行时就存在,在数据段和代码段这些内容编译完后,再运行到我们的虚拟内存.在时间上ELF可执行文件会比虚拟内存空间更早获得数据段和代码段。(ELF是一个二进制文件)
图片关系:

1. 程序员的代码和静态数据

  • 硬盘中的ELF可执行文件
程序员编写的代码和静态数据(如全局变量、静态变量等)在编译和链接后会生成一个ELF格式的可执行文件。这个文件存储在硬盘上。
  • 虚拟内存空间
当程序运行时,操作系统会将ELF可执行文件中的代码段和数据段加载到虚拟内存空间中。这些段在程序运行时被映射到虚拟地址空间中。

2. 局部变量、形参、堆内存和栈内存

  • 局部变量和形参
这些变量存储在栈内存中。栈内存是运行时动态分配的,用于存储函数调用时的局部变量和参数。栈内存的分配和释放是由编译器自动管理的。
  • 堆内存:
通过malloc()等函数分配的内存存储在堆中。堆内存是运行时动态分配的,需要程序员手动释放。
  • 栈内存和堆内存
这些内存区域是在程序运行时由操作系统分配的,而不是在编译时确定的。它们不在ELF可执行文件中,而是在程序运行时由操作系统管理。

3. 虚拟内存空间

  • 虚拟内存
虚拟内存是操作系统提供的一种内存管理机制,它将物理内存和磁盘空间结合起来,为每个进程提供一个独立的地址空间。
  • 数据段和代码段
ELF可执行文件中的数据段(.data、.bss等)和代码段(.text)在程序运行时被映射到虚拟内存空间中。这些段在编译时就已经确定,但在程序运行时才被加载到内存中。

4. 时间顺序

  • ELF可执行文件
在编译和链接阶段生成,存储在硬盘上。它包含程序的代码段和数据段。
  • 虚拟内存空间
在程序运行时由操作系统分配和管理。数据段和代码段从ELF文件中加载到虚拟内存空间中,而栈内存和堆内存则在运行时动态分配。

总结

  • ELF可执行文件
编译时生成,存储在硬盘上,包含代码段和数据段。
  • 虚拟内存空间
运行时分配,包含从ELF文件加载的代码段和数据段,以及运行时动态分配的栈内存和堆内存。
  • 栈内存和堆内存
运行时动态分配,不在ELF文件中。
可以说程序在运行的时候ELF提供数据段和代码段。

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

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

相关文章

算法 之 树形dp 树的中心、重心

文章目录 重心实践题目小红的陡峭值 在树的算法中,求解树的中心和重心是一类十分重要的算法 求解树的重心 树的重心的定义:重心是树中的一个节点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点…

Ubuntu切换lowlatency内核

文章目录 一. 前言二. 开发环境三. 具体操作 一. 前言 低延迟内核(Lowlatency Kernel) 旨在为需要低延迟响应的应用程序设计的内核版本。Linux-lowlatency特别适合音频处理、实时计算、游戏和其他需要及时响应的实时任务。其主要特点是优化了中断处理、调…

【Zinx】Day5-Part2:Zinx 的消息队列及多任务机制

目录 Day5-Part2:Zinx 的消息队列及多任务机制创建消息队列创建及启动 Worker 工作池在 Server 启动的同时对连接池进行初始化 Day5-Part2:Zinx 的消息队列及多任务机制 接下来我们需要给 ZInx 添加消息队列以及多任务 Worker 机制。可以通过限制 worke…

项目上传到Gitee过程

在gitee上新建一个仓库 点击“克隆/下载”获取仓库地址 电脑上要装好git 在电脑本地文件夹右键“Git Bash Here” 依次执行如下命令 git init git remote add origin https://gitee.com/qlexcel/stm32-simple.git git pull origin master git add . git commit -m ‘init’…

速算迷你世界脚本UI

--[[ --数学速算主界面 local UI"6996144362677448610" local v"6996144362677448610_" --自定义玩家数据界面 --显示界面分类 -- --称号积分幼儿园0学前班50小学生200初中生500高中生1000大学生2000研究生5000博士生10000教授50000 local A {["主屏幕…

坐落于杭州的电商代运营公司品融电商

坐落于杭州的电商代运营公司品融电商 在中国电商行业蓬勃发展的浪潮中,品融电商(PINKROON)作为一家扎根杭州的新锐品牌管理公司,凭借其独特的全域增长方法论和实战经验,迅速崛起为行业标杆。自2020年成立以来&#x…

mysql的Innodb最大支持的索引长度是多少,以及索引长度怎么计算

今天正好有空,来讲个之前粉丝经常问的一个知识,就是mysql的Innodb最大支持的索引长度是多少?以及索引长度怎么计算? 一、mysql的innodb引擎,创建索引最大支持的长度是多少字节? 不墨迹,直接说…

【网络安全工程】任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用:通过路由表进行数据的转发。 2、交换机的作用:通过学习和识别 MAC 地址,依据 M…

Dagger 2 系列(五)——进阶之@Scope 和 @Singleton

前言: 在上一篇Dagger 2 系列(四)——Named 和 Qualifier注解介绍,了Named 和 Qualifier注解,这篇文章,我们将会了解另外俩个注解:Scope 和 Singleton。 在这篇文章中你会了解到: …

脑电波控制设备:基于典型相关分析(CCA)的脑机接口频率精准解码方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CCA的用途二、频率求解思路三、输入数据结构四、判断方法五、matlab实践1.数据集获取及处理2.matlab代码3.运行及结果 六、参考文献 前言 在脑机接口(BCI)领…

fiddler+雷电模拟器(安卓9)+https配置

一、fiddler配置 1、开启https代理 2、根证书安装:导出证书系统安装 二、模拟器设置 1、设置网络桥接模式 【点击安装】提示安装成功后保存即可 2、开启root(开启adb远程调试) 3、开启磁盘写入 4、设置WLAN代理 5、证书安装:物…

跨越时空的对话:图灵与GPT-4聊AI的前世今生

(背景:虚拟咖啡厅,图灵身着1950年代西装,端着一杯热茶,GPT-4以全息投影形态坐在对面) 图灵(喝了口茶):“听说你能写诗?我当年在布莱切利园破解Enigma时&…

双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开

双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开 1. 软件环境⚙️2. 问题描述🔍3. 解决方法🐡解决步骤 4. 结果预览🤔 1. 软件环境⚙️ Windows10 或 Windows11 专业版64位,安装MotionGo软件&#xff08…

【时间序列聚类】Feature-driven Time Series Clustering(特征驱动的时间序列聚类)

文章目录 1.文章介绍2.问题背景3.拟解决的问题4.主要贡献5.提出的方法5.1模型pipeline5.2特征抽取和选择5.3图渲染和社区检测5.4共现矩阵的构建5.5对共现矩阵进行聚类 6.实验6.1模型设置6.2实验结果6.3消融实验 7.结论8.个人观点9.Reference 1.文章介绍 论文出处:ED…

tomcat负载均衡配置

这里拿Nginx和之前做的Tomcat 多实例来实现tomcat负载均衡 1.准备多实例与nginx tomcat单机多实例部署-CSDN博客 2.配置nginx做负载均衡 upstream tomcat{ server 192.168.60.11:8081; server 192.168.60.11:8082; server 192.168.60.11:8083; } ser…

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是,有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射(ORM)功能而闻名&#xff…

19.HarmonyOS Next CustomSlider组件基础教程(一)

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 1. 组件介绍 Slider(滑动选择器)是HarmonyOS中常用的交互组件,用于在给定的数值范围内进行连续值的选择。本教…

管中窥豹数字预失真(DPD)

管中窥豹数字预失真(DPD) 数字预失真在通信领域发挥了巨大的作用,对提高功放效率、改善误码率起了不可忽略的作用,广泛运用与通信、雷达等各种领域。但是对于普通用户,它显得及其高深神秘。今天就用这个短文&#xff…

MCP极简入门:超快速上手运行简单的MCP服务和MCP客户端

MCP是什么? 首先我们快速过一下MCP的基本概念,接着我们会通过一个简单的天气服务的教程,来上手学会使用MCP服务和在主机运行服务。本文根据官方教程改编。 1. MCP的基本概念 MCP(Model Context Protocol,模型上下文…

DeepSeek进阶应用(一):结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)

🌟前言: 在软件开发、项目管理和系统设计等领域,图表是表达复杂信息的有效工具。随着AI助手如DeepSeek的普及,我们现在可以更轻松地创建各种专业图表。 名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者&…