【每周分享】C语言中容易发生的几个常见错误
在基于C语言的嵌入式产品开发中我们会经常解决和修复一些Bug甚至有时候会被疑难杂症整的脑壳疼以为是什么高深莫测的问题但是呢有时候一些Bug分析到最后一般都是由一些小问题导致的这些小问题包括数据溢出数组越界和指针未初始化等等所以我就根据自己的一些经验和遇到的讲解在C语言开发中比较容易发生的几个错误包括错误产生的原因举例说明及如何规避。1. 忽略程序编译警告在程序编译时更多时候我们可能只关注错误errors而容易忽略警告warnnings哪怕警告有几十甚至上百个。其实很多警告就是在提醒我们该处代码操作存在潜在问题在特定情况下可能会造成程序错误。比如下面这个就是一个比较常见的警告信息大概意思就是此处应该用定义的枚举数据但实际上用的可能是整型等数据类型。如果你用的非枚举数据值是在已定义的枚举数据里面是没有问题的如果你用的值不在这个里面你的程序会怎么执行你有做入参检查吗因此对应这个警告你就尽可能的直接使用枚举数据来调用这肯定就不会错了其实这个也算是编程习惯问题。类似的还有因此在程序开发时尽量做到下面这样就完美了可以帮你提前规避一些程序潜在问题2. 宏定义漏掉括号我们使用#define定义宏时除非必须要加括号才加有时候我们可能不会刻意加上括号也可能是忘记加了结果程序运行出现异常反查代码后才发现原来是漏掉括号导致的。比如下面的代码就是很经典的一个案例目的是求x的平方值复制#define SQUARE(x) x*xunsigned char a1;printf(%d\r\n, SQUARE(a1));我们的想法肯定是求(a1)*(a1)4但实际结果为什么是3呢因为宏定义漏掉了括号导致程序实际执行的是a1*a13因此最好的定义方式是复制#define SQUARE(x) ((x)*(x))即使用#define定义宏时对每一个最小单位的操作数都加上括号哪怕就一个数字也加上养成良好的习惯复制#define MAX (255)3. 变量没有执行初始化操作对于全局变量和局部变量特别是局部变量我们一定要加初始化操作即声明好一个变量后先完成对其的初始化操作。对于局部变量如果不进行初始化其默认值不一定是0可能是其他的随机值容易导致难以预测的结果我们来看看下面的代码执行结果就知道了:4. 使用等号判断浮点数是否相等因为浮点数在不同系统上呈现出来的精度是不一样的我们不能像整型数据那样用等号来判断两个浮点数是否相等这样会导致比较结果错误影响程序的运行逻辑即不能按如下代码操作复制float a 0.11;float b 0.11;if (a b){printf(Equal\n);} else{printf(Not Equal\n);}而应该使用一个比较小的阈值THRESHOLD来间接判断两个浮点数是否相等即按如下代码操作复制#define THRESHOLD (0.000001) //该值视系统和具体情况进行自定义修改float a 0.11;float b 0.11;if (fabs(a - b) THRESHOLD){printf(Equal\n);} else{printf(Not Equal\n);}5. 使用数组对字符串的处理不正确因为字符串用数组定义的话是属于字符数组我们很容易忽视结束符“\0”从而导致访问越界比如下面的代码编译时就直接报错了因为hello加上\0是6个字符而数组大小是5因此错误了。对于这种情况可以用复制char str[6] hello; //在数组中具体指明长度对应字符串较长的情况我们总不能一个一个去数吧那就可以按如下方式定义复制char str[] hello, my name is C program!; //数组长度空在C语言中是允许的6. 数组越界操作数组是我们经常会使用到的一种数据结构也是很容易出错的主要原因是数组里定义的元素总数假设为MAX此时我们实际可以访问的数组元素是从数组[0]~数组[MAX-1]而并非是数组[MAX]如果你误操作用上数组[MAX]就属于数组越界操作了可能会导致程序崩溃等如下代码即为越界操作的示例因此对于数组操作我们尽量定义一个数组长度的宏通过使用这个宏可以规避不少误操作复制#define ARRAY_LENGTH_MAX (5)int i0;int arr[ARRAY_LENGTH_MAX] {1, 2, 3, 4, 5};printf(%d\n, arr[ARRAY_LENGTH_MAX-1]);for(i0; iARRAY_LENGTH_MAX; i){printf(%d\n, arr[i]);}以上通过实际代码讲解了C语言开发中经常遇见的几个错误以及如何规避和预防。。---------------------作者dffzh链接https://bbs.21ic.com/icview-3477780-1-1.html?_dsignbfdf001b来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。