C的强符号/弱符号

news/2024/5/20 0:01:28/文章来源:https://blog.csdn.net/SanIcDAts/article/details/129742737

首先上代码和结果:

代码:

#include  <stdio.h>
int k;
int k;
int main()
{printf("addr of k = %p\n", &k);printf("value of k = %d\n", k);return 0;
}

结果:

addr of k  = 00408074
value of k = 0

问题:
由结果可得,系统已为全局变量k开辟了内存空间(因为可以打印到变量k的地址),并且为该变量拥有初值0

可知,int k;为定义了全局变量k,但是为什么k能被定义两次呢?

分析:

  • 符号

在分析前,先来说明一下符号这个概念。在c程序生成可执行文件前,有以下步骤:预编译 -> 编译 -> 汇编 -> 链接

在生成.exe文件前的最后一步,即在链接步骤中,由项目中各个.c文件生成的.o文件(目标文件)会基于其符号表中的符号,来将各个.o文件链接在一起,生成可执行文件

下面用指令查看一下.o文件中的符号表

/* sym.c */
#include <stdio.h>
int sym = 1024;
int func_sym()
{return 0;
}int main()
{return 0;
}

指令:

gcc sym.c -o sym.o // 生成sym.o文件
nm sym.o // 查看.o文件的符号表

符号表部分内容如下:

…(省略)
00401a40 T ___main
00404004 D _sym
00401410 T _func_sym

可以看到符号表有变量sym,函数main和函数func_sym的符号

  • 强/弱符号

对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。当然也可以通过
__attribute__((weak))
来定义一个强符号为弱符号。

通过下面的例子来看看哪些是强符号,哪些是弱符号

#include<stdio.h> 
int weak; // 定义但未初始化全局变量,弱符号 
int strong = 1024; // 定义且已初始化全局变量,强符号 
__attribute__((weak)) int weak1 = 2222; // 使用标识修饰的弱符号 
int main(void) 
{ printf("test\n"); return 0; 
} 

注意,这里的强符号与弱符号都是针对定义来说的。

原理:

同名时,用哪个?变量重名时,链接器有它的处理方式:

  1. 强符号不允许重复
  2. 有一个强符号和多个弱符号,使用强符号
  3. 多个弱符号,则随意选择一个

由3.可知,在

#include  <stdio.h>
int k;
int k;
int main()
{printf("addr of k = %p\n", &k);printf("value of k = %d\n", k);return 0;
}

中,第一个k和第二个k均为未初始化的全局变量,所以均为弱符号;所以随意选择一个

参考:

  • 函数或全局变量重复定义时会怎样?
  • C语言中的强符号与弱符号

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

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

相关文章

《辉煌优配》消费医疗加速回暖 数字化新竞赛鸣枪

“栽培牙集采将给口腔职业带来深远影响。”瑞尔齿科副总经理胡云帆3月23日承受证券时报记者采访时表明&#xff0c;资料费用下降将惠及公司运营端&#xff0c;同时激活了一大批存量客户。公司相关产品和服务价格已经开端呈现一些变动的迹象。 栽培牙费用包含栽培体费用、牙冠费…

狗都能看懂的VAE笔记

文章目录自编码器普通Auto-Encoder的问题解决的方法如何运作数学细节生成模型Auto-Encoder一直是一个非常有创造性的方向。期中的VAE变分编码器一直是我没搞懂的部分&#xff0c;在AI绘画突然火起来的时候&#xff0c;不得不搞清楚VAE了。看了很多VAE的讲解&#xff0c;没有良好…

The Shebeen——爱尔兰酒吧 NFT 来袭!

从爱尔兰神像到标志性的爱尔兰帽子&#xff0c;The Shebeen——爱尔兰酒吧 NFT 系列是一系列非常吸引的独特数字资产&#xff0c;体现了爱尔兰的精神和风俗。 The Shebeen NFT 系列均来自 The Shebeen——爱尔兰酒吧游戏体验&#xff0c;3 月 17 日至 3 月 29 日可在 The Sandb…

c/c++开发,无可避免的自定义类类型(篇八).为类妥善处理异常

目录 一、异常简述 1.1 异常是什么 1.2 异常处理概念 二、异常处理 2.1 try……catch异常处理语法 2.2 动态异常说明-throw 2.3 标准异常体系 2.4 try ...catch抛出异常对象的处理 2.5 异常捕获处理级别 2.6 抛出对象方式 2.7 try 块以及处理块内严禁跳转语法使用 2.8 异常捕…

【MySQL高级篇】 第8章_索引的创建与设计原则

第8章_索引的创建与设计原则 1. 索引的声明与使用 1.1 索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 从 功能逻辑 上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。 按照 物…

Python如何实现读写txt文件?读写txt文件的方法有哪些?

前言 又是一篇纯知识点的文章&#xff0c;现在看文章的人越来越少了&#xff0c;是都去看视频了吗 今天就来聊聊 - Python实现读写txt文件的方法 一、读写模式&#xff1a; w&#xff1a;向文件中写入内容&#xff0c;w会清空原来文本内容a&#xff1a;向文件中追加内容r&am…

sql性能优化:MS-SQL(SQL Server2012)服务器配置选项(sp_configure )对照表

sql性能优化&#xff1a;MS-SQL&#xff08;SQL Server&#xff09;服务器配置选项&#xff08;sp_configure &#xff09;对照表 2019服务器配置选项 (SQL Server) - SQL Server | Microsoft Learn 2012服务器配置选项 | Microsoft Learn 介绍 可以使用 SQL Server Managemen…

什么是蓝牙的核心协议层和产品类型?一文读懂BQB认证中两者的关联

蓝牙核心协议层 什么是蓝牙核心协议层? 所有蓝牙产品必须拥有相应资格才可以进行出售或分发。而蓝牙技术是需通过软件和硬件的 组合实现,分为蓝牙HOST主机(软件)和CONTROLLER控制器(硬件)。 蓝牙核心协议层的规范如何? 目前蓝牙技术分为经典蓝牙(BR/EDR) 和低功耗蓝牙(B…

【vulhub靶场】medium_socnet

文章目录环境搭建信息收集主机发现&#xff1a;端口扫描Web 渗透(CVE-2019-14322)Pallets Werkzeug 0.15.4 路径遍历漏洞代码注入-反弹shell关于Dockerfile判断是否在Docker环境中&#xff1a;Command SHELL 提升至 Meterpreter方法一方法二Docker环境中存在内网环境内网主机探…

二分查找【含左边界查询 + 右边界查询】

789. 数的范围 - AcWing题库 二分查找看起来是很简单的一个算法&#xff0c;但是其中涉及到比较多的细节问题。 一不小心就死循环了…… 使用条件 一般情况下&#xff0c;二分查找通常适用于一个有序的序列中&#xff08;一般为升序&#xff09; 算法解析 确定左右边界 首…

Linux内核文件系统知识大总结

1、文件系统特点文件系统要有严格的组织形式&#xff0c;使得文件能够以块为单位进行存储。文件系统中也要有索引区&#xff0c;用来方便查找一个文件分成的多个块都存放在了什么位置。如果文件系统中有的文件是热点文件&#xff0c;近期经常被读取和写入&#xff0c;文件系统应…

Cursor软件,内含GPT服务,软件免费,可以进行聊天

Cursor软件,内含GPT服务,软件免费,可以进行聊天 Cursor这个软件的安装 安装好后,双点击使用: 最后有软件地址 如果英文不好,怎么办,搭配有道词典: 效率嘎嘎快 用Ctrl+K进行代码指令后面如下自动生成代码 也可以在聊天框里面进行代码的编写和对话

linux 调试系列(二)coredump段错误查找使用详解

《linux 调试系列&#xff08;一&#xff09;coredump环境配置》 《linux 调试系列&#xff08;二&#xff09;coredump段错误查找使用详解》 一、 背景 这一节&#xff0c;通过一个样例&#xff0c;详细介绍怎么使用coredump来定位程序段错误。 构造两个常用错误&#xff0c;…

STM-32:GPIO 输出-点亮LED-流水灯-蜂鸣器

目录一、GPIO1.1GPIO简介1.2GPIO 硬件解析1.2.1保护二极管1.2.2 P-MOS、N-MOS 管1.2.3数据输入输出寄存器1.2.4复用功能输出1.2.5模拟输入输出1.3GPIO 的工作模式1.3.1 输入模式 (模拟/浮空/上拉/下拉)1.3.2 输出模式 (推挽/开漏)1.3.3 复用功能 (推挽/开漏)1.3.4 小结二、GPIO…

线程与子线程

目录 一、简介 线程 主线程与子线程 线程与进程 并发和并行 二、代码编写 1、创建线程之每个线程有独立的线程函数 验证 2、创建线程 每个线程共用的同一线程函数 验证 3、回收线程资源&#xff08;阻塞&#xff09; 验证 4、分离线程&#xff08;不阻塞&a…

DI相关内容

DI相关内容5&#xff0c;DI相关内容5.1 setter注入5.1.1 环境准备5.1.2 注入引用数据类型步骤1:声明属性并提供setter方法步骤2:配置文件中进行注入配置步骤3:运行程序5.1.3 注入简单数据类型步骤1:声明属性并提供setter方法步骤2:配置文件中进行注入配置步骤3:运行程序5.2 构造…

如何用VOSviewer Online想画啥就画啥(配合python+networkX)

VOSviewer一直都是学术界文献可视化的神器&#xff0c;不过貌似很少看有人来DIY&#xff0c;随意画东西。 那笔者花了点时间测试了一下&#xff0c;发现【VOSviewer Online networkX/python】可以极快的画出好看的网络关系图。 网址&#xff1a;https://app.vosviewer.com/ …

Win10系统的截图功能 几种快捷键 以及QQ附带的截图功能

直接按 Prtsc 键 对整个屏幕截图&#xff0c;比如下图 altshiftPrtSc 对某个窗口截图 winshifts 矩形截图&#xff0c;可以对当前屏幕选择一个矩形区域截图&#xff0c;比如下面这样 如果失效,解决方法是在任务管理器里重新启动文件资源管理器的进程 参考&#xff1a;截图快捷键…

docker开启的Mysql修改时区

进入docker 查询和修改时区 注意&#xff1a;MySQL 中存储的时间默认为 UTC 时间&#xff0c;因此需要根据需要进行转换。 你可以使用以下命令查询 MySQL 当前的时区&#xff1a; SELECT global.time_zone;该命令会返回 MySQL 当前的全局时区设置&#xff0c;如果你想查询当…

.NET Core 实现Excel的导入导出

.NET Core 使用NPOI实现Excel的导入导出前言NPOI简介一、安装相对应的程序包1.1、在 “管理NuGet程序包” 中的浏览搜索&#xff1a;“NPOI”二、新建Excel帮助类三、调用3.1、增加一个“keywords”模型类&#xff0c;用作导出3.2、添加一个控制器3.3、编写导入导出的控制器代码…