一份呕心沥血整理的bug list

本文列举了C语言编程中关于指针、内存、操作系统和编译相关的常见问题,如指针类型转换错误、未初始化指针、数组越界、堆栈溢出和内存泄漏等,并详细分析了错误原因及解决方案,强调了跨平台编程时需要注意的差异和平台特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1、 指针相关

 

(1)      指针类型转换出错

 

比如下面这个写串口的函数,长度len是一个int型指针:

 

图1 写串口API示例

 

在调试时发现当串口无回复重发时再次去写串口,传进去的长度变了,无法正常写串口

 

图2串口调试log截图

 

想要写的数据是上面红框中,实际写的数据是下面红框中,检查发现是传进去的len指针类型不对,把一个char型的 len传进去了,下面的代码很容易出错:

 

 

但是Char型指针应该会自动强制转换为int型指针的啊?怎么还会出错呢?

 

         Int型指针转化为char型指针肯定不会出错,而char型指针转化为int指针可能(极大可能))出错,为什么呢?

         数据都是以一定的规则存储在对应内存区里,内存最小单元为1byte,数据最终对应的都是硬地址,char型数据占一个内存单元,int型数据占4个内存单元,short型数据占两个内存单元,char型数据的地址都是1的倍数,int型数据地址都是4的倍数,short型地址都是2的倍数,这样底层才能保证数据整齐,内存好管理。

一个int型指针转化为char型指针没问题,是因为4的倍数肯定也是1的倍数,因此int型地址可以随意转化成char型或者short型地址,而把一个char型指针转化成int型指针那极有可能出错,因为1的倍数不一定就是4的倍数,指针在获取数据时可能就会指不到那个位置(比如地址0x0002转成int地址就会出错),即使指到了那个位置获取到的数据也会不对,因为char型指针转为int型指针,相当于多要了3个单元的内存,你怎么知道那3个单元的内存里面原来没有存别的数据呢?

         一句话总结指针类型转化:长的指针类型可以转化为短的,短的不能转化为长的。

 

 

 

 

图3 指针转换图

 

 

(2)      指针没有初始化

 

向没有初始化的指针去引用指针所指内存的值,或者去赋值,肯定会使系统挂掉。指针在没有指向有效的缓存地址时,是没有意义的。如下面代码就会使系统崩溃。

 

 

2、 内存相关

 

 

(1)      数组下标越界——一个“=”引发的血案

 

系统初始化时去flash里取数据存到用户的缓存中,用宏定义定义缓存的大小,调试时发现,把数据定义成1024byte,没问题,定义成384byte,一上电就挂掉了,为什么会这样?定的小点反而有问题?

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值