unsigned short *强制转换unsigned int *,另一个参数莫名被修改

Ansersion 2016-04-05 04:33:58
代码很简单,如下。
结果很匪夷所思,输出为:
1: WAN
2: N
求解释

#include <stdlib.h>
#include <stdio.h>

void xxx(const unsigned char * msg, unsigned int * size)
{
*size = msg[6];
}

void main()
{
unsigned char a[8] = {'W', 'A', 'N', 31, 246, 0, 0, 15};
unsigned short d = 0xa5a5;
printf("1: %c%c%c\n", a[0], a[1], a[2]);
xxx(a, (unsigned int *)&d);
printf("2: %c%c%c\n", a[0], a[1], a[2]);
}
...全文
474 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ansersion 2016-04-06
  • 打赏
  • 举报
回复
楼上讲的都对,平均给分了
paschen 2016-04-05
  • 打赏
  • 举报
回复
unsigned int是4个字节,unsigned short是占2个字节,写的时候已经写到后面的内存了
旧剑鞘 2016-04-05
  • 打赏
  • 举报
回复
你把unsigned short d 这个short变量的地址当做int变量地址送给xxx函数处理,破坏了之后两个字节的内存,结果未定,在你的机器上就是那个结果~~~~
小灸舞 版主 2016-04-05
  • 打赏
  • 举报
回复
楼主自己sizeof(unsigned short)看看是不是2,如果是2的话那肯定修改了地址的跨度
sdghchj 2016-04-05
  • 打赏
  • 举报
回复
这有什么好匪夷所思的?short型只占2字节,把它的地址强制成int*传参,当作占4个字节修改,自然修改到了其它地方。

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧