【不算奇葩的问题】MDK用c99的void*作为函数的形参使用出BUG

本文探讨了在C99标准下使用MDK时遇到的关于void*类型转换的问题,特别是在将其转换为unsigned char时的数据错误现象,并提供了两种解决方法。

这是偶然使用MDK的C99模式发现的BUG,不过也不能算BUG!!

怎么说呢???


咱初学C/C++时候,都知道void*可以强转成任意类型,但是不能反过来转,即

void *p;

unsigned char *k,z;

k = (char*)p;//正确

p = (void*)k;//错误


我遇到的这个BUG是void*强转为unsigned char时,数据错误,在使用W5500官方库文件时,有类似的代码

z = *(unsigned char*)p;//数值错误

z = (unsigned char)p;//数值正确


原因:

我就是想说到底C99能不能void*强转为*(unsigned char*)呢,答案实测是不能滴,但是w5500官方库的代码却又有类似“z = *(unsigned char*)p;”这种代码,好坑爹!!!因为w5500官方库是GNU的gcc标准,gcc扩充了void*的使用,为定长类型,和char*相同,而ANSI是不支持void*为定长的类型(/ □ \),具体见gcc标准https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc.pdf的第403页 void的sizeof长度为1


解法一:

改库文件,全都把z = *(unsigned char*)p;改成z = (unsigned char)p;这种形式

解法二:

在调用类似ctlwizchip等函数时,不要直接把“宏”当作参数放进去,用一个uint8_t的数值传入指针即可

eg:

uint8_t tmp = IK_SOCK_1;

ctlwizchip(CW_SET_INTRMASK,(void*)&tmp);

所以,必须手动修改这部分代码!!浪费了2天时间,还以为我自己代码写错了呢Orz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值