[STM32F2] C语言指针操作求教

[复制链接]
1599|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,不需要&。
 楼主| fengyefeng 发表于 2015-4-16 20:15 | 显示全部楼层
感谢各位回答,谢谢你们,这方面知识,我还不是太懂,我的试验环境是IAR+STM32,我使用了#pragma pack(1)指定对齐,结果一样,我再仔细看看各位的回答,谢谢
fhguo1990 发表于 2015-4-16 20:25 | 显示全部楼层
第2行,后面的&a,不需要&。
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,所以输出来就是你看到的结果
你画个地址的格子,分别把数据填入一看就明白了,,这样说我解释很困难,你看起来也很困难
wind~风 发表于 2015-4-30 21:59 | 显示全部楼层
上面有一点错误,于是a[0]的值0x200005a0~0x200005a3分别为89,12,ef,ed这句话最后的ed应该是cd,打错了
kamen588 发表于 2015-5-1 19:11 | 显示全部楼层
32位变量 四个地址
 楼主| fengyefeng 发表于 2015-9-23 22:57 | 显示全部楼层
感谢各位热情的回答,谢谢各位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

87

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部