C规范编辑笔记(七)

news2024/11/19 15:15:47

往期文章:

C规范编辑笔记(一)
C规范编辑笔记(二)
C规范编辑笔记(三)
C规范编辑笔记(四)
C规范编辑笔记(五)
C规范编辑笔记(六)

正文:

大家好,今天来分享一下C语言规范编辑笔记的第七篇,分享这个是希望自己后面忘记了可以去复习一下,同时也希望分享给有需要的小伙伴,所以在每一篇的开头,我都加了以往文章的链接~

好了,话不多说,我们直接来看这期的内容:

1、禁止隐式类型转换。建议使用显式转换,特别是在有符号和无符号类型之间。防止有符号数被转换成无符号数的时候会出错。
如以下案例可以看出:

Bad example:
signed int v1 = -1;     //定义v1为有符号整型
unsigned int v2 = 1;    //定义v2为无符号整型
if (v1 < v2)   //这样比较对将v1隐式转换为无符号,而-1转换为无符号后就为无符号int的最大值,所以这样,v1永远不可能大于v2
{
/* v1转换为无符号int,值-1变为UINT_MAX,因此if条件始终为false */
}

Good example:
signed int v1 = -1;
unsigned int v2 = 1;
if (v1 < (signed int)v2)  //通过显示转换,将v2也转换为有符号的
{
/* v2显式转换为有符号整数-条件为true */
}

另外这里需要注意一旦,如果是无符号数用在for循环中,需要注意不能使条件小于0,这样就一直循环下去!!!,如下例子对比:

Bad example:
uint8_t idx;
//以下循环是无限的:idx是无符号的,idx>=0始终为真,因为无符号值不能为负
for(idx = 27; idx >= 0; idx --) {
...
}

Good example:
//有符号整数转换用于避免无限循环
for(idx = 27; (int8_t)idx >= 0; idx --) {
...
}
或者
idx=27;
while (idx >0)
{
...
}

2、建议 - 不要在不同结构的类型上使用指针类型转换。因为这会涉及到自身以外的内存,造成数据错误。如我们通过下述案例可以知道:

Bad example:
#define TAB_SIZE 16U    

typedef struct {
    int32_t magic;
} s_a;      //创建s_a结构体类型

typedef struct {
    int32_t magic;
    int16_t s;
    uint8_t x[TAB_SIZE];
} s_b;      //创建s_b结构体类型

void foo(s_a* structa) {
s_b* p = (s_b*)structa; /* 将其转换为位s_b类型 */
p->magic = 0xBAADCAFE;
p->s = 0xDEAD; /* 结构s_a外部溢出 */
p->x[0] = 4; /* 以及数据被覆盖的风险(缓冲区溢出),因为s_a大小小于s_b,所以必然在内存中被转换为s_b类型的s_a会占用后面其他的内存,造成覆盖掉后面的内存的数据!!! */
}

Good_example:
#define TAB_SIZE 16U

typedef struct {
    int32_t magic;
} s_a;

typedef struct {
    s_a h;       //在s_b结构体里面包含s_a结构体,这样后面只用结构体s_b就可以同时也使用s_a结构里面的参数
    int16_t s;
    uint8_t x[TAB_SIZE];
} s_b;

void foo(s_b* structb) {
structb ->h.magic = 0xCAFEBABE;
structb ->s = 0xBEEF;
structb ->x[0] = 4;
}

从上述两个例子可以对比看出,第一个不好的例子因为将s_a的结构体变量显示转换为s_b结构体类型,造成指针p后面指向的内存空间大小变为了s_b的大小,而超出了s_a本身结构体的范围,所以就会报错,而好的例子中采用包含s_a结构体完美的解决了这个问题。

好了,今天因为两个规范建议用的例子都比较长,所以今天我们就先分享到这里~
我们C规范编辑笔记第八篇见~

在这里插入图片描述
本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~

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

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

相关文章

ADI Blackfin DSP处理器-BF533的开发详解26:扩展IO输入的详细讲解(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件设计原理图 功能介绍 ADSP-EDU-BF53x 开发板上扩展接口的 PORT2 和 PORT3 中引出了 6 个扩展 IO 接口输入接口&#xff0c;这些连接到了CPLD…

C. Rooks Defenders Codeforces Round #791 (Div. 2)(树状数组!)

传送门 题意&#xff1a;给你一个的棋盘&#xff0c;然后给你一个t&#xff08;t只能为1&#xff0c;2&#xff0c;3&#xff09;&#xff0c;对于不同的t产生不同的影响&#xff1a; t1时&#xff0c;给你一个点的坐标x,y&#xff0c;在这个点上生成一辆坦克&#xff08;保证…

模拟实战从外网打点渗透到内网域控的笔记

信息收集 本次项目是一个是模拟渗透测试 电信诈骗网站&#xff0c;境外人员依赖该网站通过优惠卷诱导受害者进行消费&#xff0c; 诈骗受害人金钱。 前台地址 项目拓扑图 http://ip/user.php?moddo&actlogin&fromtohttp%3A%2F%2F43.143.193.216%2F 后台地址 http…

rabbitmq基础2——rabbitmq二进制安装和docker安装、基础命令

文章目录一、RabbitMQ安装1.1 二进制安装1.2 rabbitmqctl工具1.3 docker安装二、rabbitmq基础命令2.1 多租户与权限类2.1.1 创建虚拟主机2.1.2 查看虚拟主机信息2.1.3 删除虚拟主机2.1.4 给用户授权2.1.5 清除用户权限2.1.6 查看权限2.2 用户管理类2.2.1 创建用户2.2.2 查看用户…

爱心源码动图-Html网页运行

程序示例精选 爱心源码动图-Html网页运行 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff01; 前言 Html写的追女生神器-爱心动图&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读&#xff0c;对学习与使用Html有较好的帮助。 文章目录 一、所需工具…

Redis高可用之主从复制、哨兵、cluster集群

Redis高可用之主从复制、哨兵、cluster集群Redis 高可用什么是高可用Redis的高可用技术Redis主从复制主从复制的作用主从复制流程搭建Redis主从复制所有节点安装Redis修改master节点的配置文件修改slave节点的配置文件验证主从效果Redis哨兵模式哨兵模式的作用哨兵结构故障转移…

Redis集群模式

目录 前言 一、集群的作用 二、集群模式的数据分片 三、集群模式的主从复制模型 四、Redis集群模式 Redis集群部署 开启群集功能 修改所有集群服务的配置文件端口&#xff0c;使其不一致 启动集群 集群测试 前言 1、集群&#xff0c;即 Redis Cluster&#xff0c; …

模型效果差?我建议你掌握这些机器学习模型的超参数优化方法

模型优化是机器学习算法实现中最困难的挑战之一。机器学习和深度学习理论的所有分支都致力于模型的优化。 机器学习中的超参数优化旨在寻找使得机器学习算法在验证数据集上表现性能最佳的超参数。超参数与一般模型参数不同&#xff0c;超参数是在训练前提前设置的。举例来说&a…

CKA考试Tips

前言 今年黑五的双证套餐的折扣比双11时还便宜个200多,不到2000&#xff0c;应该是史低吧,反正比前年低。即使考试前看了各种避坑技巧&#xff0c;虽然通过了但是结果还是因为各种问题导致时间不够没做完扣分&#xff0c;于是下面总结一下参加CKA/CKS考试时候的技巧。 报名及考…

[基因遗传算法]进阶之四:实践VRPTW

参考资料: 《旅行商问题(TSP)、车辆路径问题(VRP,MDVRP,VRPTW)模型介绍》 本文对《基于GA算法解决VRPTW》的分析和思考.具体的代码可以参考 《Python实现(MD)VRPTW常见求解算法——遗传算法&#xff08;GA&#xff09;》 . 文章目录壹、VRPTW一. 定义类二、数据读取三. 构造初…

JVM调优手段

JDK提供命令工具 jstat 是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据&#xff0c;在没有 GUI图形界面&#xff0c;只提供了纯文本控制台环境的服务器上&#xff0c;它将是运行期定位虚拟…

博球一看,CSDN与你共观世界杯

2022卡塔尔世界杯不知不觉已接近尾声&#xff0c;不仅让人感叹&#xff0c;乌拉圭&#xff0c;巴西&#xff0c;葡萄牙都已淘汰&#xff0c;四强诞生分别是阿根廷&#xff0c;法国&#xff0c;摩洛哥&#xff0c;克罗地亚&#xff0c;非常期待梅西和魔笛的对决&#xff0c;也希…

电子学会2020年12月青少年软件编程(图形化)等级考试试卷(三级)答案解析

目录 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共3题&#xff0c;共30分&#xff09; 青少年软件…

【云计算与大数据技术】虚拟化简介及虚拟化的分类讲解(图文解释 超详细)

一、虚拟化简介 1&#xff1a;什么是虚拟化 虚拟化是指计算机元件在虚拟的基础上而不是在真实的、独立的物理硬件基础上运行。这种以优化资源、简化软件的重新配置过程为目的的解决方案就是虚拟化技术 虚拟化架构就是在一个物理硬件机器上同时运行多个不同应用的独立的虚拟系…

r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现|视频

Glmnet是一个通过惩罚最大似然关系拟合广义线性模型的软件包。正则化路径是针对正则化参数λ的值网格处的lasso或Elastic Net&#xff08;弹性网络&#xff09;惩罚值计算的。 最近我们被客户要求撰写关于LASSO的研究报告&#xff0c;包括一些图形和统计输出。该算法非常快&am…

电子学会2020年12月青少年软件编程(图形化)等级考试试卷(四级)答案解析

目录 一、单选题&#xff08;共15题&#xff0c;每题2分&#xff0c;共30分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共4题&#xff0c;共50分&#xff09; 青少年软件…

51单片机——LED 点阵点亮一个点,小白详解

LED点阵介绍&#xff1a; LED点阵是由发光二极管排列组成的显示器件&#xff0c;在我们生活中的电器中随处可见&#xff0c;被广泛用于汽车报站器&#xff0c;广告屏等。 通常用用较多的是8*8点阵&#xff0c;然后使用多个8*8点阵组成不同分辨率的LED点阵显示屏&#xff0c;比如…

kubernetes--kube-proxy组件深入理解

文章目录kube-proxy的工作原理netfilter的运行机制ipvs和iptables有什么区别&#xff1f;iptables在网络栈的hook点更多&#xff0c;而ipvs的hook点很少iptables的hook点ipvs的hook点如何切换&#xff1f;ipvs安装为何推荐ipvs&#xff1f;为什么iptables或者ipvs在每个节点上都…

面试官:你会几种分布式 ID 生成方案???

1. 为什么需要分布式 ID 对于单体系统来说&#xff0c;主键 ID 常用主键自动的方式进行设置。这种 ID 生成方法在单体项目是可行的&#xff0c;但是对于分布式系统&#xff0c;分库分表之后就不适应了。比如订单表数据量太大了&#xff0c;分成了多个库&#xff0c;如果还采用…

基于java+springboot+mybatis+vue+mysql的福聚苑社区团购

项目介绍 随着互联网的发展&#xff0c;各种团购模式也越来越多&#xff0c;尤其是最近几年的社区团购模式更是如火如荼的在进行着&#xff0c;我了能够让大家品味到更多的瓜果蔬菜&#xff0c;我们通过java语言&#xff0c;springboot框架、前端vue技术、数据库mysql开发了本…