news 2026/10/21 9:03:02

<span class=“js_title_inner“>review同事写的这段C代码有点小问题~</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>review同事写的这段C代码有点小问题~</span>


正文


大家好,我是bug菌~

最近跟同事一起review代码,发现有一段似曾相识的C代码让我想起来一个bug,入行这么久断断续续在一些公司代码或者开源中遇到过多次这种编码,有些bug你看起来平平无奇,真正在编码过程中一不留神就容易踩坑了。

有些bug也不一定会立马表现出问题,就像越界也只是说有可能会篡改数据或者读到错数据,但在某个编译器某次自动编排内存的时候,所篡改的内存并没有用到,一切风平浪静,然而你的同事某一天需要加一个功能,才加几行毫不相干的代码,定义了几个变量,程序就莫名其妙的奔了,让他一脸懵~

1

bug

大家先不看后面的解析,读一遍代码看能不能立马看出这段代码潜在的风险:

#include <stdio.h> struct person { constchar *name; int id; }; staticconststruct person employees[] = { {"bug1", 1001}, {"bug2", 1002}, {"bug3", 1003}, }; void print_employees(void) { struct person *p = (struct person *)employees; while (p->name != NULL) { printf("Employee: %s (ID: %d)\n", p->name, p->id); p++; } } int main(void) { print_employees(); return0; }

2

分析

编写者期望当p->name为NULL时循环终止。然而,由于数组末尾没有显式的终止标志,循环将有可能越过数组边界,继续访问数组之后的内存区域大概率会崩溃,然而当恰巧遇到值为0的内存位置,循环意外终止,运行正常。

其实回味起来感觉就是挺简单的,正常情况下都自信满满不会写出这种的代码,但实际我在多份代码中都有遇到类似的问题。

要改这个问题当然就很简单了,显式的增加终止标志,行业内专业一点的叫法叫做哨兵元素,养成习惯了一般不会出问题。

static const struct person employees[] = { {"bug1", 1001}, {"bug2", 1002}, {"bug3", 1003}, {NULL, 0} // 明确的终止标志 };

也通常推荐大家再类似编程的时候,使用数组长度来进行管控,如:

void print_employees(void) { int count = sizeof(employees) / sizeof(employees[0]); for (int i = 0; i < count; i++) { printf("Employee: %s (ID: %d)\n", employees[i].name, employees[i].id); } }

最后

好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个赞~

唯一、永久、免费分享嵌入式技术知识平台~

推荐专辑 点击蓝色字体即可跳转

☞MCU进阶专辑

☞嵌入式C语言进阶专辑

☞“bug说”专辑

☞专辑|Linux应用程序编程大全

☞专辑|学点网络知识

☞专辑|手撕C语言

☞专辑|手撕C++语言

☞专辑|经验分享

☞专辑|电能控制技术

☞专辑 | 从单片机到Linux

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 4:45:59

架构思维的精髓:在解构与集成间驱动数字化演进

架构思维的精髓&#xff1a;在解构与集成间驱动数字化演进 在快速迭代的数字时代&#xff0c;软件架构已不再是冰冷的技术图纸&#xff0c;而是连接复杂业务现实与数字化抽象世界的核心协议。优秀的架构思维&#xff0c;本质上是在混沌中建立秩序、在约束中寻找平衡的艺术。一、…

作者头像 李华
网站建设 2026/10/18 22:59:56

实时渲染 + AI算法:直播美颜SDK中智能美妆的技术架构拆解

在直播电商、线上娱乐、视频社交全面爆发的当下&#xff0c;“画面好不好看”早已不是锦上添花&#xff0c;而是决定用户是否停留的第一生产力。 而支撑这一切体验的核心能力&#xff0c;正是——直播美颜SDK中的智能美妆技术。 很多人看到的是一键上妆、实时磨皮、自然美型&…

作者头像 李华
网站建设 2026/10/17 12:27:58

社会网络仿真软件:UCINET_(4).基本网络指标计算与解释

基本网络指标计算与解释 在社会网络分析中&#xff0c;网络指标是理解网络结构和节点关系的重要工具。本节将详细介绍如何使用UCINET软件计算和解释一些基本的网络指标&#xff0c;包括度数中心性、接近中心性、介数中心性和网络密度等。通过这些指标&#xff0c;我们可以更好地…

作者头像 李华
网站建设 2026/10/21 0:54:50

社会网络仿真软件:UCINET_(9).结构洞与社会资本

结构洞与社会资本 1. 结构洞的基本概念 结构洞&#xff08;Structural Holes&#xff09;是社会网络分析中的一个重要概念&#xff0c;由社会学家罗纳德伯特&#xff08;Ronald Burt&#xff09;在1992年提出。结构洞是指网络中两个非相邻节点之间的空隙&#xff0c;即在网络…

作者头像 李华