打印
[STM32F2]

C语言指针操作求教

[复制链接]
942|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengyefeng|  楼主 | 2015-4-15 23:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Uint32 a[4];
printf("&a=%#x\n",&a);      //&a=0x200005a0
*(Uint32*)0x200005a0=0x23456789;
printf("a[0]=%#x\n",a[0]);  //a[0]=0x23456789,这里能理解
printf("a[1]=%#x\n",a[1]);  //a[1]=0xefcdab98

*(Uint32*)0x200005a1=0xabcdef12;
printf("a[0]=%#x\n",a[0]);  //a[0]=0xcdef1289,为什么这里会变成这样       
printf("a[1]=%#x\n",a[1]);  //a[1]=0xefcdabab
printf("a[2]=%#x\n",a[2]);  //a[2]=0x31fff04f,a[2]、a[3]值不变       
printf("a[3]=%#x\n",a[3]);  //a[3]=0xd11c62b9

为什么这么赋值后,a[0]、a[1]内的内容会变成这样???
还请各位看一看,指导指导
沙发
huangxz| | 2015-4-16 06:56 | 只看该作者
没有对齐操作,一切都有可能,不用为这种非法的做法找解释了。

使用特权

评论回复
板凳
戈卫东| | 2015-4-16 07:55 | 只看该作者
首先,要确定你所用的处理器能够支持这样的操作,即允许非对齐的存储器访问。
然后,要确定你的处理器是“Little Endian”的字节顺序。
最后,把涉及的存储单元每个字节的值写在格子里就很简单了。

使用特权

评论回复
地板
diweo| | 2015-4-16 12:04 | 只看该作者
1,涉及到非对齐操作,有点乱,最好在纸上画画格子和箭头。。
2,第2行,后面的&a,不需要&。

使用特权

评论回复
5
fengyefeng|  楼主 | 2015-4-16 20:15 | 只看该作者
感谢各位回答,谢谢你们,这方面知识,我还不是太懂,我的试验环境是IAR+STM32,我使用了#pragma pack(1)指定对齐,结果一样,我再仔细看看各位的回答,谢谢

使用特权

评论回复
6
fhguo1990| | 2015-4-16 20:25 | 只看该作者
第2行,后面的&a,不需要&。

使用特权

评论回复
7
wind~风| | 2015-4-30 21:57 | 只看该作者
原因:你的数组是32位的变量,一个数要占32位,也就是4个地址,所以0x200005a0~0x200005a3存的都是a[0]的值,分别对应的是89,67,45,23,a[1]的值存在0x200005a4~0x200005a7,分别是98,ab,cd,ef,
*(Uint32*)0x200005a1=0xabcdef12;这一句的意思是给0x200005a1地址写入0xabcdef12,这是32位的数据,实际上是给0x200005a1~0x200005a4分别写入12,ef,cd,ab,于是a[0]的值0x200005a0~0x200005a3分别为89,12,ef,ed;a[1]的值0x200005a4~0x200005a7分别为ab,ab,cd,ef,所以输出来就是你看到的结果
你画个地址的格子,分别把数据填入一看就明白了,,这样说我解释很困难,你看起来也很困难

使用特权

评论回复
8
wind~风| | 2015-4-30 21:59 | 只看该作者
上面有一点错误,于是a[0]的值0x200005a0~0x200005a3分别为89,12,ef,ed这句话最后的ed应该是cd,打错了

使用特权

评论回复
9
kamen588| | 2015-5-1 19:11 | 只看该作者
32位变量 四个地址

使用特权

评论回复
10
fengyefeng|  楼主 | 2015-9-23 22:57 | 只看该作者
感谢各位热情的回答,谢谢各位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

87

帖子

1

粉丝