0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

必看!15个C语言常见陷阱及避坑指南

哈哈hfgfdf 来源:电子嵌入式学习 作者:电子嵌入式学习 2025-03-16 12:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

C语言虽强大,但隐藏的“坑”也不少!稍不留神就会导致程序崩溃、数据异常。本文整理15个高频陷阱,助你写出更稳健的代码!

陷阱1:运算符优先级混淆

问题:运算符优先级不同可能导致计算顺序错误。

int a = 5, b = 3;

int c = a++ * --b; // a=6, b=2, c=10

若写成 ++a * b--,结果会变为 c=18(a=6, b=2)。

解决:

熟记优先级表,或用括号明确顺序:

int c = (a++) * (--b);

陷阱2:变量名大小写敏感

问题:myVar和 MyVar会被视为不同变量。

int MyVar = 5;

int myvar = 3;

printf("%d", MyVar + myvar); // 输出8

解决:

统一命名风格(如全小写+下划线),避免混淆。

陷阱3:数组越界访问

问题:访问不存在的下标导致崩溃或数据污染。

int arr[3] = {1,2,3};

int x = arr[3]; // 越界!

解决:

牢记数组下标范围是 0到长度-1。

陷阱4:整型溢出

问题:数值超出类型范围会“循环”取值。

unsigned char x = 255;

x += 1; // x=0

解决:

预估数值范围,选用 `int32_t`、`uint64_t` 等合适类型。

陷阱5:空指针解引用

问题:未初始化指针直接使用导致崩溃。

int *p = NULL;

*p = 5; // 致命错误!

解决:

使用前检查指针有效性:

if (p != NULL) *p = 5;

陷阱6:随机数种子未设置

问题:rand()默认种子固定,导致随机序列重复。

for (int i=0; i<10; i++) {  

printf("%d ", rand()); // 每次输出相同序列

}

解决:

用 srand(time(NULL))`初始化种子。

陷阱7:字符串未正确终止

问题:忘记添加 `` 导致字符串异常。

char str[10] = "hello";

str[5] = 'w'; // 覆盖了原结尾的

printf("%s", str); // 输出乱码

解决:

手动补 ``:

str[5] = 'w';

str[6] = '';

陷阱8:死循环

问题:循环条件错误导致无限执行。

int i=0;

while (i < 10) {  

printf("%d ", i);

} // i未自增,死循环!

解决:

检查循环变量是否更新,或用 `for` 替代。

陷阱9:变量作用域错误

问题:在作用域外访问变量。

if (x == 1) {

int y = 2;

}

printf("%d", y); // 编译错误!

解决:

理解作用域规则,必要时将变量声明在外部。

陷阱10:隐式类型转换

问题:未显式转换导致结果错误。

int a = 5;

double b = 2.0;

printf("%f", a / b); // 正确写法:(double)a / b

解决:

手动强制转换类型,避免隐式转换歧义。

陷阱11:函数参数不匹配

问题:参数数量或类型错误导致编译失败。

int add(int a, int b);

printf("%d", add(1,2,3)); // 参数过多!

解决:

严格匹配函数声明与调用参数。

---

陷阱12:空结构体指针访问

问题:未初始化指针访问成员导致崩溃。

struct Person *p = NULL;

printf("%s", p->name); // 访问空指针!

解决:

检查指针是否有效后再操作。

陷阱13:文件未正确关闭

问题:未处理 `fopen` 失败或忘记 `fclose`。

FILE *fp = fopen("test.txt", "r");

// 未检查fp是否为NULL

fclose(fp); // 若fp为NULL,程序崩溃

解决:

始终检查文件指针,并确保关闭:

if (fp != NULL) fclose(fp);

陷阱14:宏定义未加括号

问题:宏展开后运算顺序错误。

#define SQUARE(x) x*x

int b = SQUARE(a+1); // 展开为a+1*a+1=2a+1

解决:

宏参数用括号包裹:

#define SQUARE(x) (x)*(x)

陷阱15:多线程未同步

问题:多线程竞争导致数据错乱。

// 两个线程同时调用printf可能输出乱序

pthread_create(&t1, NULL, print_msg, "Thread1");

pthread_create(&t2, NULL, print_msg, "Thread2");

解决:

使用互斥锁(mutex)或信号量同步线程。

总结:C语言陷阱虽多,但通过规范编码、充分测试和工具检查(如静态分析工具),可大幅降低风险。建议收藏本文,编码时多自查!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144599
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    皮线光缆选购指南:避开3大陷阱,选对“光速通道”

    )。 G.657A2光纤:抗弯曲性强,适合室内布线(如家庭宽带)。 指南: 室内场景必须选G.657A2,否则弯曲处信号衰减超标。 室外自承式光缆可选用G.652D+抗弯曲涂层,兼顾成本与性能。
    的头像 发表于 11-09 17:44 1034次阅读
    皮线光缆选购<b class='flag-5'>指南</b>:避开3大<b class='flag-5'>陷阱</b>,选对“光速通道”

    指南!RK3568开发板选型,这5点没看清千万别下手!(附迅为驱动开发指南资源)

    指南!RK3568开发板选型,这5点没看清千万别下手!(附迅为驱动开发指南资源)
    的头像 发表于 10-30 15:49 333次阅读
    <b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>!RK3568开发板选型,这5点没看清千万别下手!(附迅为驱动开发<b class='flag-5'>指南</b>资源)

    MES系统指南

    架构普及化 、 AI 算法工程化应用 、 数字孪生技术落地 。MES 系统已逐渐成为企业实现生产智能化的核心引擎。以下结合行业数据与技术趋势,为您解析国内MES 系统厂商的竞争力,并提供选型指南。 二、MES 系统厂商竞争力
    的头像 发表于 10-29 13:46 110次阅读

    PCBA打样全流程指南:为电子产品研发保驾护航

    一站式PCBA加工厂家今天为大家讲讲电子产品研发阶段PCBA打样要注意哪些问题?PCBA打样全流程指南。在智能硬件产品研发中,PCBA打样是决定项目成败的关键环节。我们处理过上万次研发打样
    的头像 发表于 09-22 09:21 491次阅读
    PCBA打样全流程<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>:为电子产品研发保驾护航

    绝对值编码器指南常见选型误区之混淆“分辨率”与“精度”,盲目追求高分辨率

    绝对值编码器作为精准定位与运动控制的核心部件,其选型直接影响设备的精度、稳定性和寿命。但在实际选型中,由于对技术参数、应用场景和产品特性的理解偏差,很容易陷入误区。本文针对绝对值编码器选型的常见误区之一:混淆“分辨率”与“精度”,盲目追求高分辨率,并提供对应的
    的头像 发表于 08-04 11:24 815次阅读
    绝对值编码器<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>:<b class='flag-5'>常见</b>选型误区之混淆“分辨率”与“精度”,盲目追求高分辨率

    PLC工业智能网关:功能解析、场景落地与选型攻略

    如何避免选型踩?本文从技术原理、核心价值、典型场景、指南四大维度,结合真实案例与行业趋势,为您彻底拆解PLC工业智能网关的“真面目”。
    的头像 发表于 07-16 13:21 454次阅读
    PLC工业智能网关:功能解析、场景落地与选型<b class='flag-5'>避</b><b class='flag-5'>坑</b>攻略

    2025年G口大带宽服务器选购指南这3点,省下50%成本!

    面对市场上琳琅满目的服务器产品,如何避免踩、实现成本与性能的平衡,成为企业和个人用户关注的焦点。本文将从配置需求、要点、成本控制三大维度,为您提供一份客观、简洁的2025年G口大带宽服务器选购
    的头像 发表于 07-10 10:17 1315次阅读

    工程师必存!IO模块十大指南

    甚至安全事故。本文将整理常见的 IO 模块选型错误,通过 “事故案例 + 解决方案” 的形式,为工程师们提供一份实用的指南。​ 一、忽略抗干扰设计​ 事故案例​ 某大型工厂的自动化
    的头像 发表于 06-26 12:06 680次阅读
    工程师必存!IO模块十大<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>

    工业现场电磁干扰强?聚徽解码工控一体机抗干扰“指南

    权威标准与工业现场实战经验,总结出一套“指南,助力企业降低60%以上的电磁干扰故障,保障工业自动化系统的稳定运行。 一、源头:设备
    的头像 发表于 06-12 14:37 816次阅读

    EMC 设计指南:四不口诀

    明明设计得很好,为什么一做EMC测试就失败?雷卯EMC小哥教大家4超实用的EMC设计技巧四不口诀,帮你避开常见!准则1让电流“走捷径”,不绕远路核心逻辑:高频电流走“电感最小路径”,环路越大→辐射越强!雷卯实验室关键知识点
    的头像 发表于 05-29 09:03 2948次阅读
    EMC 设计<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>:四不口诀

    揭秘Air780EPM开发陷阱:20指南与最佳解决方案

    重复报错、资源过载等“隐形陷阱”消耗大量开发时间。本文基于经验提炼20关键问题,传授规避技巧与优化方案,让您的代码更健壮。希望能帮助到需要的朋友,欢迎一起学习交流。   最新开发资料详见
    的头像 发表于 05-21 16:04 598次阅读
    揭秘Air780EPM开发<b class='flag-5'>陷阱</b>:20<b class='flag-5'>个</b><b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>与最佳解决方案

    选购高精度贴片机必看!5大核心关注点与指南

    贴片机,成为众多企业面临的难题。本文将为您揭示选购高精度贴片机的核心关注点,并提供实用的指南,助您做出明智决策。一、核心关注点1、贴装精度:贴装精度是高精度贴片机
    的头像 发表于 05-08 11:45 818次阅读
    选购高精度贴片机<b class='flag-5'>必看</b>!5大核心关注点与<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>

    多模光纤跳线全解析:类型、选型指南建议

    ,为您全方位的解析多模光纤跳线的类型及选型指南。无论您是网络工程师还是数据中心规划者,3分钟掌握这些要点,可规避80%的部署风险!
    的头像 发表于 04-28 09:43 933次阅读
    多模光纤跳线全解析:类型、选型<b class='flag-5'>指南</b>与<b class='flag-5'>避</b><b class='flag-5'>坑</b>建议

    嵌入式开发指南|FreeRTOS的5\"反直觉\"小技巧

    、SPI) 4-7:控制层(PID算法、PWM生成) 1-3:后台层(日志、UI刷新) 注:STM32建议不超过32优先级 指南: 使用xTaskCreateStatic(
    发表于 03-20 13:57

    MOS管选型十大陷阱:参数误读引发的血泪教训MDD

    提供指南。一、VDS耐压虚标:动态尖峰的致命盲区误读后果:某充电桩模块标称650V耐压MOS管,实际测试中因关断尖峰达720V导致批量击穿。数据手册陷阱:厂家
    的头像 发表于 03-04 12:01 1223次阅读
    MOS管选型十大<b class='flag-5'>陷阱</b>:参数误读引发的血泪教训MDD