深入分析——为什么未初始化的全局变量是零?

news2024/11/24 16:57:02

1、前言

#include <stdio.h>

int temp;

int main(void)
{
	//打印temp的值是零
	printf("temp=%d\n", temp);

	return 0;
}
  • 在C语言编程中,我们默认未初始化的全局变量、静态局部变量的初始化值都是零,底层原理如下
    • 未初始化的全局变量、静态局部变量在链接时都属于bss、sbss段,会集中存放
    • 编译器默认添加的启动代码里把bss段都做了清零操作
  • 裸机开发时,如果你在编译时使用-nostdlib、-nostdinc、-T选项,不使用标准库、不使用标准头文件,自己编写汇编启动代码,如果自己添加的启动代码里没有对bss段进行清零,那未初始化的全局变量、静态局部变量的初始化值就不一定是零

2、查看sbss、bss段

在这里插入图片描述

3、查看默认链接脚本

在这里插入图片描述在这里插入图片描述

  • 使用–verbose选项查看默认链接脚本:riscv64-unknown-elf-ld --verbose > build.ld
  • 在链接脚本中可以看到sbss、bss段,两个段是紧挨着的。开始地址是__bss_start标号处,结束地址是__BSS_END__标号处

4、查看编译器默认添加的启动代码

在这里插入图片描述
在这里插入图片描述

  • 通过反汇编来查看编译器添加的启动代码。我们编写的代码是从main函数开始,main函数之前的代码都是编译器添加的,其中_start标号处是程序的入口,也就是执行的第一条代码

5、分析反汇编代码里的bss、sbss段

在这里插入图片描述

6、启动代码中初始化bss段

在这里插入图片描述

  • 编译器调用memset函数来把sbss、bss段的初始值格式化成零
  • memset函数需要传入三个参数:起始地址、格式化的值、格式化空间大小,分别是通过a0、a1、a2寄存器来传递,这是和芯片架构相关的,本文是基于riscv架构来分析,可参考博客:《RISC-V架构的函数调用规范和栈布局》
  • 指定sbss段的起始地址这里没有用__bss_start标号,而是使用temp变量的地址,__bss_start标号也是指向temp变量的地址,两种方式是等价的

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

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

相关文章

揭秘AI写作工具:如何改变内容创作新格局

小伙伴们&#xff0c;今儿咱们来聊聊那些个让人眼前一亮、脑洞大开的AI写作神器——笔灵AI写作、宙语AI写作、博思白板AI写作&#xff0c;还有讯飞星火&#xff0c;它们啊&#xff0c;简直就是文案人儿的超级辅助&#xff0c;让咱们写东西的时候&#xff0c;灵感嗖嗖地往外冒&a…

TinyOS -数据发布实验

文章目录 简介分析 简介 分发协议主要用于维护网络共享配置的一致性&#xff0c;这里的共享配置可以是节点传感器采样的周期、节点LPL醒睡的周期或者节点运行程序的映像等。每个节点都会维护一份这样的配置&#xff0c;分发协议负责通知每个节点这些配置的改变&#xff0c;并通…

国产分布式数据库开启新篇章!详解安全可靠测评结果公告(2024年第2号)

重磅消息&#xff01;2024年的安全可靠测评结果&#xff08;数据库篇&#xff09;终于揭晓了&#xff01;&#x1f680; 9月30日&#xff0c;国庆前夕&#xff0c;中国信息安全测评中心和国家保密科技测评中心联合发布了今年第二号测评结果&#xff0c;这份名单有效期三年&…

大数据新视界 --大数据大厂之大数据驱动智能客服 -- 提升客户体验的核心动力

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

MATLAB与R语言在建模中的合作与应用(下篇)

目录 目录 模型训练的协同使用 1. 使用 R 语言进行统计建模 2. 使用 MATLAB 进行机器学习建模 模型评估与调优 1. 在 R 中评估模型性能 2. 在 MATLAB 中进行模型优化 实战示例&#xff1a;MATLAB 与 R 的协同建模 总结 在上篇文章中&#xff0c;我们介绍了 MATLAB 和 R…

打工人狂喜,轻松定时发圈

自动定时发圈软件有哪些优势&#xff1f; 1、不用下载安装软件 2、不需要绑定手机或电脑 3、不对电脑或手机做限制 4、不越狱不刷机 5、能更新迭代 6、有售后服务 7、使用安全登录&#xff0c;保障账号安全的 8、不用去做独立部署&#xff08;可以选择&#xff09; 9、…

class 032 位图

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. 左程云的个人空间-左程云个人主页-哔哩哔哩视频…

重生之我们在ES顶端相遇第 20 章 - Mapping 参数设置大全(进阶)

文章目录 0. 前言1. 前置知识 - _source2. copy_to3. doc_values4. index5. enabled6. normalizer7. null_value8. 总结 0. 前言 在基础篇&#xff0c;我们只介绍了索引 Mapping 的基本用法。 本章将深入探讨日常中较经常使用的 Mapping 其他参数配置。 不想看过程&#xff0c…

Qt 实现动态时钟

1.实现效果 2.widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace

陪护小程序|护理陪护系统|陪护小程序成品

智能化&#xff0c;作为智慧医疗宏伟蓝图的基石&#xff0c;正引领着一场医疗服务的深刻变革。在这场变革的浪潮中&#xff0c;智慧医院小程序犹如璀璨新星&#xff0c;迅速崛起&#xff0c;而陪护小程序的诞生&#xff0c;更是如春风化雨&#xff0c;细腻地触及了老年病患、家…

Spring Cloud Netflix Ribbon 负载均衡详解和案例示范

1. 引言 在传统的集中式架构中&#xff0c;负载均衡器一般是放置在服务器端的&#xff0c;例如 Nginx等。随着微服务架构的兴起&#xff0c;服务实例的数量和部署地点变得更加动态和分布式&#xff0c;这使得在客户端进行负载均衡成为了一种可行且更灵活的方案。Netflix Ribbo…

【Linux】Linux命令与操作详解(二)权限管理、存储管理(磁盘分区、格式化、挂载)、进程管理、yum软件包安装

文章目录 一、前言二、权限管理2.1、用户权限2.2、权限说明2. 3、常用命令1、chmod2、chown3、chgrp 三、存储管理磁盘的分区、格式化与挂载1、新建一块硬盘2、在新建硬盘中进行分区3、格式化4、挂载 四、进程管理进程管理命令1、ps2、top3、nice 五、YUM软件包安装1、修改默认…

算法6:模拟运算

文章目录 z字形变幻外观数列数青蛙 题目均来自于力扣 z字形变幻 class Solution { public:string convert(string s, int numRows) {int n s.size();if(n < numRows || numRows 1) return s;int d 2 * numRows - 2;string res;for(int j 0; j < n; j d){res s[j]; …

Chromium 中<a> 标签href 属性实现分析c++

HTML 链接&#xff08;Anchor&#xff09;是网页之间跳转的核心部分。 HTML 使用链接与网络上的另一个文档相连。 HTML中的链接是一种用于在不同网页之间导航的元素。 链接通常用于将一个网页与另一个网页或资源&#xff08;如文档、图像、音频文件等&#xff09;相关联。 …

如何解决位置在表里的二维码的错行问题

众所周知&#xff0c;sap 里的二维码&#xff0c;在从其他形式转换成二维码之后&#xff0c;会经常有数据位置改变的情况&#xff0c;想让它老老实实待在原地很难&#xff0c; 这里要注意设置行间距&#xff0c;如果行间距不合适&#xff0c;就会导致错位

桥梁检测系统源码分享

桥梁检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision 研究…

Vue入门-指令学习-v-on

v-on 作用&#xff1a;注册事件 添加监听 提供处理逻辑 语法&#xff1a; v-on:事件名"内联语句" v-on:事件名"methods中的函数名" 注意&#xff1a;" v-on&#xff1a;"可以替换为" " v-on:click"XXX" --> cli…

CPU中的寄存器是什么以及它的工作原理是什么?

在计算机科学中&#xff0c;寄存器是数字设备中的一个重要组成部分&#xff0c;它用于存储数据和指令以快速处理。寄存器充当临时存储区&#xff0c;信息可以在这里被快速访问和操作&#xff0c;以执行复杂任务。寄存器是计算机中最基础的存储类型&#xff0c;它们在帮助机器高…

如何写出Pythonic的代码?

f-string、三元操作、各种解析式、生成器装饰器的熟练运用&#xff0c;“内库”引用和函数封装再加持PEP8&#xff0c;撰写的脚本不pythonic都难。&#x1f60e; (笔记模板由python脚本于2024年10月07日 18:03:27创建&#xff0c;本篇笔记适合特别喜欢python的coder翻阅) 【学习…

LeetCode讲解篇之377. 组合总和 Ⅳ

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 总和为target的元素组合个数 可以由 总和为target - nums[j]的元素组合个数 转换而来&#xff0c;其中j为nums所有元素的下标 而总和target - nums[j]的元素组合个数 可以由 总和为target - nums[j] - nums[k]的…