尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C语言入门:常见陷阱与调试技巧——避坑指南

C语言入门:常见陷阱与调试技巧——避坑指南
📅 发布时间:2026/6/25 14:09:07

十大常见陷阱

1. 数组越界

int arr[5] = {1, 2, 3, 4, 5}; arr[5] = 10; // 越界!不报错,可能改坏别的数据

C 语言不检查数组越界。后果:改坏相邻变量、段错误、"看起来正常"但埋隐患。

防御:循环条件用< 长度,不用<=。

2. 忘记 \0

char name[5]; strcpy(name, "hello"); // "hello" 需要 6 字节(含 \0),溢出!

防御:声明字符数组时多留 1 字节给\0。用strncpy限制长度。

3. 野指针(悬垂指针)

int *p = malloc(sizeof(int)); free(p); *p = 10; // 未定义行为!p 已经是野指针

防御:free(p)后立刻p = NULL。

4. 内存泄漏

void leak() { int *p = malloc(1000); return; // 忘记 free(p),内存泄漏 }

malloc和free必须配对。长期运行的程序泄漏会慢慢吃光内存。

检测工具:Valgrind(Linux)、dr.memory(Windows)。

5. = 和 == 搞混

if (a = 5) // 永远为真!赋值 if (a == 5) // 比较

C 语言最常见的逻辑 bug 来源之一。

6. switch 没 break

switch (x) { case 1: printf("one"); // 没 break,穿透 case 2: printf("two"); // 也会执行 }

防御:每个 case 末尾加break。

7. 整数除法截断

float result = 1 / 3; // result = 0.0(整数除法) float result = 1.0 / 3; // result = 0.333...(浮点除法)

防御:要小数结果,至少一个操作数用浮点类型。

8. scanf 忘记 &

int x; scanf("%d", x); // 错!应该是 &x scanf("%d", &x); // 对

字符串不需要&(数组名本身就是地址):

char name[50]; scanf("%s", name); // 正确

9. sizeof 误解

int arr[5]; printf("%zu", sizeof(arr)); // 20(整个数组) ​ void func(int arr[]) { printf("%zu", sizeof(arr)); // 8(指针,不是数组!) }

数组传函数后退化为指针,sizeof失效。

10. 未初始化变量

int x; printf("%d\n", x); // 垃圾值,未定义行为

防御:声明时赋初值:int x = 0;。


调试技巧

printf 调试法

最简单直接,在关键位置打印变量值:

printf("DEBUG: x = %d, p = %p\n", x, (void*)p);

GDB 调试器

gcc -g program.c -o program # 编译时加 -g 保留调试信息 gdb ./program # 启动 GDB (gdb) run # 运行 (gdb) backtrace # 崩溃后查看调用栈 (gdb) print x # 查看变量值 (gdb) break main # 在 main 设断点 (gdb) next # 单步执行

Valgrind 内存检测

valgrind ./program

检测:内存泄漏、越界访问、使用未初始化内存、double free。


常见错误信息对照

错误信息原因
Segmentation fault解引用无效指针、数组越界
Bus error内存对齐问题
Double free对同一指针 free 两次
Use after freefree 后继续使用指针
Stack overflow递归无基线条件、栈上数组太大

防御性编程习惯

  1. 声明变量时赋初值— 避免垃圾值

  2. malloc 后立刻检查 NULL— 避免空指针

  3. free 后立刻置 NULL— 避免野指针

  4. 字符串操作用安全版本—strncpy、snprintf

  5. 循环条件用<不用<=— 避免 off-by-one

  6. 不确定优先级就加括号— 避免运算顺序错误

  7. 函数参数传指针时标注 const— 防止意外修改

总结

  • C 的陷阱大多源于"不检查"——越界、类型、空指针都不会报错

  • 调试三件套:printf、GDB、Valgrind

  • 防御性编程比事后调试更重要——写代码时就避免陷阱

  • 遇到 Segmentation fault 先查指针和数组越界

相关新闻

  • 【软件测试】day02设计测试点
  • Spring AI 实战指南(十五):AI Agent 中台源码级设计——从零实现自己的 Agent Framework
  • ISO新兴认证全景图:42001人工智能治理与38505数据治理赋能企业数字化

最新新闻

  • 如何区分低代码、零代码、无代码?三者关系深度解析
  • Obsidian中表格数据粘贴的智能转换解决方案
  • 如何快速掌握AlienFX Tools:从灯光失控到个性化设置的终极指南
  • 2026 年国内十大 PMP 培训机构综合对比(客观评测)
  • FanControl终极调校指南:从风扇噪音到静音散热的高效解决方案
  • QuickRecorder终极指南:10MB内搞定专业级macOS屏幕录制

日新闻

  • 利用微PE工具箱进行系统安装教程
  • 渗透测试十大核心工具实战指南:从信息搜集到报告生成全流程解析
  • 暗黑破坏神2存档编辑器:网页版角色修改工具完全指南

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号