打印
[C语言]

C语言变量强制转换问题

[复制链接]
1158|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wonderful111|  楼主 | 2015-7-28 13:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
函数原型:
uchar ucTest(uchar *ucInBuff,ushort usInLen, uchar *OutBuff, ushort usOutLen);

第一种情况:
uchar ucINBuff[500];
ushort usLen = 0;
uchar ucOutBuff[500];
uint uiOutLen = 0;

if( ucTest(ucInBuff, usLen, ucOutBuff, (ushort *)&uiLen) != TRUE )


第二种情况:
uchar ucINBuff[500];
ushort usLen = 0;
uchar ucOutBuff[500];
ushort usOutLen = 0;

if( ucTest(ucInBuff, usLen, ucOutBuff, &usOutLen) != TRUE )  

请问:第一种情况会有没有什么隐患?请详解一下。谢谢

相关帖子

沙发
sjnh| | 2015-7-28 13:44 | 只看该作者
函数第4个参数是 ushort , 第一种情况强制转换成指针了,肯定编译都有问题, 是不是你的函数参数定义错了;
uint,ushort有没有隐患就看他们两个的多少字节的长度;好像51系列都是2字节的,那就可以;

使用特权

评论回复
板凳
wonderful111|  楼主 | 2015-7-28 14:05 | 只看该作者
其实是这样的:
我使用的是STM32,不是8位MCU;
第一种情况是我之前一直使用的,但最近发现我们设备有时候操作时,导致整机复位;
后来发现是这个函数的原因,改为第二种情况就没有问题;
监控数据,发现:函数第4个参数,是数据包输出的长度,正常的话,返回2个字节,但出错的时候,返回的是536870914字节,即十六进制:20000002个字节...

现在不明白的是为何变成这样子?第一种情况以前一直没发现,也用了很长时间都没有问题的。请大神门分析一下..

@sjnh 你说:“第一种情况强制转换成指针了,肯定编译都有问题”
请问编译怎么都有问题?

函数第4个参数变量是可变的,最长不会超过4个字节长度

使用特权

评论回复
地板
ayb_ice| | 2015-7-28 14:27 | 只看该作者
明明参数是变量(第4个参数),你传递个指针,这明显有问题

可能编译都过不了

使用特权

评论回复
5
wonderful111|  楼主 | 2015-7-28 14:35 | 只看该作者
不好意思,我写错了,
函数应该是原型:
uchar ucTest(uchar *ucInBuff,ushort usInLen, uchar *OutBuff, ushort *usOutLen);

使用特权

评论回复
6
sjnh| | 2015-7-28 14:49 | 只看该作者
wonderful111 发表于 2015-7-28 14:05
其实是这样的:
我使用的是STM32,不是8位MCU;
第一种情况是我之前一直使用的,但最近发现我们设备有时候 ...

强制转换成ushort后只操作uiOutLen的低2字节,如果高字节原来有数据是不变的,那么读uiOutLen那得到的数据就是错误的;

使用特权

评论回复
评论
john_lee 2015-7-28 15:08 回复TA
正解 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

54

帖子

2

粉丝