c语言常见小错误记录

        使用C编程经常会碰到各种各样的问题,很多问题都是小错误引起的,却不太容易发现,在此记录一下。

1、调用空指针

        这是一个比较常见的错误,申明了某个类型的指针变量却没有给其赋值,之后直接调用就会发生这种问题,如果在单片机中一般会发生死机的情况。

       对于指针的使用,通常都会先判断非空再使用,这样可以极大的避免这类错误。

2、类型申明错误

        如果定义了一个char类型的变量,在使用extern外部申明的时候申明成short类型,使用的时候很容易发生越界问题,因为你以为是按照char型操作,计算机却按照short操作。

3、数组越界

       数组越界也是很常见的问题,工作中有一次出现的bug就是数组越界导致的。在一些嵌入式设备中,数组越界后问题不会立即出现,而是在特定情况下才出现,原因是越界的数组可能覆盖了其后地址中的一段代码或数据,如果程序运行过程中不使用这段代码或数据就不会出问题,一旦使用就会出问题,

4、指针传参问题

        很多时候需要将指针作为参数传入函数,此时如果有以下两个情况:

         a、这个指针变量是临时的、局部的;

         b、这个指针在别的地方使用;

        此时就会出现指针指的值不对了。原因很简单,a条件说明这个函数退出后这个指针变量就不存在了,所以之后调用调了一个不存在的指针。

        实际中两种场景会出现上述问题,

        1、多任务系统,通过队列发送指针变量;

        2、中断、非阻塞函数的参数传入指针变量;

5、char数组作为string操作问题

        在c语言中,string类型就是char类型的数组,唯一不同的是string类型的最后用0作为结束标志。所以如果自己申明的char数组想作为string操作的话一定要记得在数组中加0作为结束符,否则操作会错误。

6、long和long long类型的格式化输出

        长整型的格式化输出要使用%llu-%lu-%ld-%lld。

7、无符号数相减仍然是无符号数

        无符号数相减结果还是无符号数,如果是小数减大数,结果就会是一个很大的数,是负数的无符号结果。用printf打印是无法判断一个数是有符号还是无符号的,因为打印时要指定类型,所以%d就按照有符号打印,%ud就按照无符号打印。

8、bool类型取反问题

      bool类型取反要用“!”,如果用“~”则只有第一次生效,之后永远都是1。前者是逻辑非,后者是按位取反。按位取反在将0取反后变为全1,赋值到原变量后由于变量是布尔类型,会强制转为1,之后再取反是0xfffffffe,赋值后又强转为1,如此反复。

9、段错误

      很多时候会对工程代码进行分段,这些段根据不同的要求会放不同的代码。如果一个函数放错了段,系统在运行时就会出错。

10、字节对其

        有些系统对字节有对其要求,如果不对齐就可能发生错误,所以如果出现类似一个变量定义和不定义导致系统不同行为的现象就要注意是否是字节对其问题了。

11、8位赋值给16位

        一个无符号8位整型赋值给有符号16位整型时,得到的都是正数。因为16位正数可以涵盖无符号8位所有的数。如果想要得到有符号16位数必须先将8位无符号转成有符号数再赋值。

 

 

                                  

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值