30条初学C语言踩过的坑(下):结构体字节数死活算不对

发布时间:2026/7/27 21:51:59
30条初学C语言踩过的坑(下):结构体字节数死活算不对 这最后一批全是我当年入门半年后踩的坑——结构体、宏定义、位运算、简单的嵌入式开发。很多问题在当时看来毫无头绪现在回头看只觉得好笑。前期入门只会踩基础语法坑真正拉开新手差距的全是这些课本不讲、编译器不报错、只有实战才会翻车的细节。下面这10条进阶避坑笔记新手进阶一定要吃透。1. 结构体内存对齐字节数总和总对不上初学算结构体大小永远和自己预想的不一样。CPU为了读取速度会自动填充对齐空字节。结构体大小不等于成员简单相加做协议、做硬件通信经常翻车。需要精准字节时必须手动关闭对齐#pragma pack(1)2. || 短路机制条件判断逻辑莫名失效前面为假后面代码直接不运行导致部分函数根本没执行。if (0 func()) { // func永远不执行 }3. 位运算和逻辑运算分不清一个符号之差全盘报废和、|和||混用程序逻辑彻底废掉肉眼极难发现。int a 1, b 2; if (a b) // 位与结果是0条件为假 if (a b) // 逻辑与结果是1条件为真 // 一个符号之差整个逻辑全变了4. 有符号/无符号移位规则不同移位结果总莫名其妙有符号右移补符号位无符号右移统一补0混用之后数值完全错乱。5. 三目运算符乱拆分加分号破坏表达式结构// 错误乱加分号 int a (x y) ? x : y; // 正确保持完整 int a (x y) ? x : y;6. 函数不写返回值类型现代编译器全报警告老教材允许隐式int现代编译器已禁止必须写全返回值类型。7. void函数不能return数值void func() { return; // 正确 return 1; // 错误 }8. const不是绝对安全以为const变量完全无法修改实际上指针强转依然能改内存数据只是编译期保护。9. 宏定义不加括号优先级彻底乱套宏只是纯文本替换不加括号优先级直接乱套。#define MUL(a,b) a*b // MUL(12, 34) 变成 12*34 11彻底算错 // 正确写法 #define MUL(a,b) ((a)*(b))10. volatile不懂用处读不到最新硬件数据初学接触单片机时不懂volatile。编译器优化缓存变量永远读不到最新硬件数据调试到崩溃。volatile int flag; // 强制每次从内存读取30条初学C语言亲身踩坑笔记到这篇正式完结了。我还有一些其他方面的笔记大家爱看的话我继续整理· 初学汇编踩坑全集· 初学Socket网络编程踩坑全集· 初学单片机/嵌入式踩坑全集