C的强符号/弱符号
首先上代码和结果:
代码:
#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++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。当然也可以通过

来定义一个强符号为弱符号。
通过下面的例子来看看哪些是强符号,哪些是弱符号
#include<stdio.h>
int weak; // 定义但未初始化全局变量,弱符号
int strong = 1024; // 定义且已初始化全局变量,强符号
__attribute__((weak)) int weak1 = 2222; // 使用标识修饰的弱符号
int main(void)
{ printf("test\n"); return 0;
}
注意,这里的强符号与弱符号都是针对定义来说的。
原理:
同名时,用哪个?变量重名时,链接器有它的处理方式:
- 强符号不允许重复
- 有一个强符号和多个弱符号,使用强符号
- 多个弱符号,则随意选择一个
由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语言中的强符号与弱符号
相关文章:
C的强符号/弱符号
首先上代码和结果: 代码: #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问题&…...
AD/DA转换(XPT2046)
AD/DA介绍AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号AD/DA转换打开…...
乐观锁和悲观锁 面试题
Mysql的乐观锁和悲观锁 实现方式加锁时机常见的调用方式优势不足适用场景乐观锁开发自定义更新数据的时候sql语句中进行version的判断高并发容易出现不一致的问题高并发读,少写悲观锁Mysql内置查询数据的开始select * for update保证一致性低并发互联网高并发场景极…...
【Autoware规控】mpc_follower模型预测控制节点
文章目录1. 技术原理2. 代码实现1. 技术原理 MPC,即Model Predictive Control(模型预测控制),是一种基于动态模型的控制算法。MPC算法通过建立系统的数学模型,根据当前状态和一定时间内的预测,优化未来的控…...
成果VR虚拟3D展厅让内容更丰富饱满
随着数字技术的不断发展和普及,数字化展厅成为了一种重要的展示形式。线上虚拟展厅作为数字化展示的一种新形式,采用虚拟现实技术,能够克服时空限制,打破传统展览业的展示模式,为用户提供更加丰富、立体、沉浸式的展览…...
【CE进阶】lua脚本使用
▒ 目录 ▒🛫 导读需求开发环境1️⃣ 脚本窗口Lua ScriptLua EngineAuto assemble2️⃣ 全局变量3️⃣ 进程当前打开的进程ID系统的进程列表系统的顶部窗口列表4️⃣ 线程5️⃣ 输入设备6️⃣ 屏幕7️⃣ 剪贴板🛬 文章小结📖 参考资料&#x…...
【vue2】近期bug收集与整理02
⭐【前言】 在使用vue2构建页面时候,博主遇到的问题难点以及最终的解决方案。 🥳博主:初映CY的前说(前端领域) 🤘本文核心:博主遇到的问题与解决思路 ⭐数据枚举文件的使用 同后端那边发送请求的时,请求返…...
2. 01背包问题
文章目录QuestionIdeasCodeQuestion 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi ,价值是 wi 。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入…...
【Docker】CAdvisor+InfluxDB+Granfana容器监控
文章目录原生命令 docker stats容器监控3剑客CIGCAdvisorInfluxDBGranfanacompose容器编排,一套带走新建目录新建3件套组合的 docker-compose.yml检查配置,有问题才有输出 docker-compose config -q启动docker-compose文件 docker-compose up -d测试浏览…...
k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结
k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结 大纲 1 nginx镜像选择2 创建configmap保存nginx配置文件3 使用inotify监控配置文件变化4 Dockerfile创建5 调整镜像原地址使用阿里云6 创建deploy部署文件部署nginx7 测试使用nginx配置文件同步&…...
动态内存管理(上)——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是动态内存管理噢,下面,让我们进入动态内存管理的世界吧 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 为什么存在动态内存分配 我们已…...
GPT-4发布,这类人才告急,大厂月薪10W+疯抢
ChatGPT最近彻底火出圈,各行各业都在争相报道,甚至连很多官媒都下场“跟风”。ChatGPT的瓜还没吃完,平地一声雷,GPT-4又重磅发布! 很多小伙伴瑟瑟发抖:“AI会不会跟自己抢饭碗啊?” 关于“如何…...
MySQL数据库实现主主同步
前言 MySQL主主同步实际上是在主从同步的基础上将从数据库也提升成主数据库,让它们可以互相读写数据库,从数据库变成主数据库;主从相互授权连接,读取对方binlog日志并更新到本地数据库的过程,只要对方数据改变,自己就…...
JavaScript传参的6种方式
JavaScript传参的方式1. 传递基本类型参数2. 传递对象类型参数3. 使用解构赋值传递参数4. 使用展开运算符传递参数5. 使用可选参数6. 使用剩余参数JavaScript是一门非常灵活的语言,其参数传递方式也同样灵活。在本篇文章中,会详细介绍JavaScript中的参数…...
蓝桥之统计子矩阵
样例说明 满足条件的子矩阵一共有 19 , 包含: 大小为 11 的有 10 个。 大小为 12 的有 3 个。 大小为13 的有 2 个。 大小为 14 的有 1 个。 大小为 21 的有 3 个。 前缀和二维数组 前缀和暴力搜索 import java.util.*; public class Main{private static int ans0;pub…...
Java的基础面试题
一.java基础1.JDK和JRE有什么区别?JDK是java开发工具包,JRE是java运行时环境(包括Java基础类库,java虚拟机)2.和equals的区别是什么?比较的是两者的地址值,equals比较的是两者的内容是否一样3.两…...
J1939故障码诊断说明
1:1939整体协议说明 这里主要说明1939不同的协议,对应不同的网络分层 注意了,这里只进行文档解析说明,具体查看去搜素协议的关键字进行理解 2:DMx和FMI 说明 想知道每个代号的具体含义,可以去 saeJ1939…...
XCPC第十三站,贪心问题
一.区间选点 我们采取这样的策略来选点:step(1)将区间按照右端点的大小从小到大排序;step(2)从前往后依次枚举每个区间,如果当前区间中已经包含点,直接pass,否则选当前区…...
一文让你吃透 Vue3中的组件间通讯 【一篇通】
文章目录前情回顾前言1. 父组件 > 子组件通讯传递2. 子组件 > 父组件通讯传递3. 爷孙组件,后代组件通讯数据总结前情回顾 在本专栏前一章节中,我为大家带来了 Vue3 新特性变化上手指南 的归纳梳理,主要介绍了 Vue3 的 Proxy 响应式原理…...
EVE遭遇大规模DDOS攻击,玩家和官方都傻眼了
如果你恰好是一名《星战前夜》(EVE)的国际服玩家(虽然这个几率很小),又恰好因为疫情一直待在家里,那你就真是倒霉透顶了。因为从1月底开始,EVE的服务器就一直受到大规模的DDOS攻击,而…...
别再怪硬件了!DELL服务器风扇噪音的元凶与精准静音指南(iDRAC+IPMI实战)
别再怪硬件了!DELL服务器风扇噪音的元凶与精准静音指南(iDRACIPMI实战) 服务器风扇突然狂转,噪音飙升?先别急着给硬件判死刑。这背后往往是一场系统散热策略与硬件兼容性的无声对话。作为管理员,我们需要透…...
从零手写K-Means聚类算法:理解初始化、分配与收敛的底层原理
1. 项目概述:从零手写K-Means,不只是调包,而是真正理解聚类的“心跳”你有没有过这种感觉:调用sklearn.cluster.KMeans跑完一个聚类任务,结果图一出、轮廓系数一算,好像就结束了?但当同事问起“…...
CANN/asc-devkit同步通知API文档
asc_sync_notify 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcod…...
LeetCode--112. 路径总和(二叉树)
题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点 是指没…...
LIMA模型:仅需千条优质数据,SFT微调即可媲美GPT-4的对齐效果
1. 项目概述:LIMA的横空出世与核心价值最近,Meta AI发布了一个名为LIMA(Less Is More for Alignment)的模型,在社区里激起了不小的水花。这个项目的标题信息量巨大——“媲美GPT-4”、“无需RLHF就能对齐”,…...
2026年JAVA语言前端还可以学吗?是否还能找到好工作?
因为Java并不是前端语言。前端开发主要用的是 HTML、CSS、JavaScript/TypeScript,以及 React、Vue 等框架。可能您是混淆了 Java 和 JavaScript,或者想问的是“学 Java 还能找到好工作吗?前端还能学吗?” 下面我分开讲清楚&#x…...
受够了网盘限速?2026年更顺手的不限速同步盘选择
受够了网盘限速、下载慢、传大文件卡顿?如果你的核心诉求是“上传下载不被限速、同步稳定、多人协作更省心”,下面这4款网盘可以作为备选参考。本文以“传输体验 同步效率 安全合规 协作能力”做客观对比,方便你按需选择。 先看对比表&am…...
SchemaCrawler:终极数据库模式发现与理解工具完全指南
SchemaCrawler:终极数据库模式发现与理解工具完全指南 【免费下载链接】SchemaCrawler Free database schema discovery and comprehension tool 项目地址: https://gitcode.com/gh_mirrors/sc/SchemaCrawler 在当今数据驱动的时代,数据库模式发现…...
fltk-rs常见问题解决方案:从编译错误到运行时问题的全面排查
fltk-rs常见问题解决方案:从编译错误到运行时问题的全面排查 【免费下载链接】fltk-rs Rust bindings for the FLTK GUI library. 项目地址: https://gitcode.com/gh_mirrors/fl/fltk-rs fltk-rs是Rust语言的FLTK GUI库绑定,为开发者提供了轻量级…...
为什么顶级AI艺术家总在第3轮生成才出片?——揭秘构图迭代中的“临界收敛点”与3次生成内锁定最佳构图的硬核策略
更多请点击: https://kaifayun.com 第一章:为什么顶级AI艺术家总在第3轮生成才出片? AI图像生成并非“一击必中”的魔法,而是一场精密的概率博弈。Stable Diffusion、DALLE 3 和 MidJourney v6 等主流模型在采样过程中采用多步去…...
