C语言常见错误

暂时不分类,按问题堆积


分类1:


错误1.1:地址操作,指针加减法算错地址

原因,未对指针做处理,可能传参进来的指针是指向结构体等,想用详细的地址操作,最好转成void*或者char*,再进行地址加减法操作。因为忽略指针类型很可能按数据结构大小(或数组大小)去进行加减运算,偏差巨大。如果原参是数组char ch[10],形参是指针char *,其实+1也是地址1;反之亦反,+1是地址10,主要看传进来的形参的形态。



错误1.2:数组越界,无法追踪错误根源

这类错误比较恼人,之前很正常的模块突然出了错误,用gdb调试,bt追溯,心中奔跑的只有草泥马,完全无解有没有。而你的直觉也告诉你不是那个模块出的错。具体是哪引起的问题很难追溯。解决办法似乎也只有靠经验和记忆了,一般来说肯定是新写的模块错误(也可能是近期稍早时候,看运气了),新模块的数组越界了。比如strncpy传入了没有结尾的字符串或者n的值太大,擦写到了不该擦写的地方,所以导致其他模块出错,而具体是谁擦写了那个倒霉的模块,很难知道,因为一大个工程,各种各样的数组和变量堆积在一起,人挤人,变量挤变量,数组挤数组。所以好的习惯很重要,分配一个数组时最好先初始化置零,使用strncpy拷贝进信息时也最好比预留的少一个,这样比较保险,比如要拷贝"hello"进来,一般需要6个字节,其中一个结束符'\0',为了保险,可以给数组7个字节,双结束符。

PS:也许有其他方法追溯这种错误,通过打印各变量的地址(这在一个大的工程里不可想象),或者其他调试工具的命令吧?反正我调试工具玩的不6,现在不会。





























  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值