C/C++实际开发中常见问题及预防、定位方法系列(三)
前文见
C/C++实际开发中常见问题及预防、定位方法系列(一)
C/C++实际开发中常见问题及预防、定位方法系列(二)
分别讲解了编程风格和内存引出的问题,本系列文章第三篇讲解C/C++最常见的其它类问题。
1、 字节对齐
这是很多初学者都很难搞明白的概念。在实际开发中,如果编译环运行环境涉及到不同的编译器、系统、或者硬件,由于不同的编译器、系统、甚至硬件的字节对齐策略都可能不一致,这会照成严重的传输数据错误,所以在实际的系统开发中,这是一个值得注意的问题。
为了避免照成此类问题,有两个习惯值得推广:
a)、用sizeof计算结构体所占内存空间
b)、尽量使用#pargam pack()指定策略。
2、 总线错误
相对于段错误,总线错误是一个很少碰到的问题。我们知道,段错误基本上都是由访问非法内存造成的。总线错误也有固定的元凶,那就是字节未对齐。
数据项只能存储在地址是数据项大小的整倍数的内存位置上,这是由CPU的工作原理决定的,如果出现这个问题,你要做的是好好检查你定义的结构体以及对结构体成员的一些比较复杂的寻址操作。
3、 除零错误
顾名思义,检查你的/运算符的分母是否为0
4、 大小端、网络字节序、本地字节序
这是个历史遗留问题,一个所占字节超过1个的变量类型到底是应该低字节放低位、高字节放高位还是应该低字节放高位、高字节放低位,每个厂商都有自己的定义。所以造成了现在我们编程时必须考虑到字节序大小端的问题。
只在同一台机器上运行的软件还好,不涉及到不同硬件的交互,所以不需要考虑这个问题,但是网络程序必须考虑。所以为了统一标准,有了网络字节序、本地字节序的概念。
不管你本地是大端还是小端,你在网络传输时需要将你要传输的数据转为大端的网络字节序。