关于union的内存分配

john0122 2013-02-23 10:43:47
#include<stdio.h>
int checkSystem();
int main(){

union
{
int i;
char s[4];
}c;
c.i = 0x1234;

printf("%x\n",c.s[0]);
printf("%x\n",c.s[1]);
printf("%x\n",c.s[2]);
printf("%x\n",c.s[3]);
printf("c %d\n",sizeof(c));
printf("c.i %d\n",sizeof(c.i));
printf("c.s %d\n",sizeof(c.s));
printf("c.s[0] %d\n",sizeof(c.s[0]));


return 0;
}


结果是34 12 0 0
4 4 4 1;
为什么s[0]和s[1]打出来的结果是34和12呢?
...全文
386 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-02-24
  • 打赏
  • 举报
回复
LZ觉得应该怎样?
leolee82 2013-02-24
  • 打赏
  • 举报
回复
int 0x1234在内存中是4个字节,为 0x34 12 00 00
赵4老师 2013-02-24
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
john0122 2013-02-24
  • 打赏
  • 举报
回复
不好意思,一个字节是8位,16进制数占的是4位,我弄错了。
duola_rain 2013-02-24
  • 打赏
  • 举报
回复
引用 7 楼 leolee82 的回复:
int 0x1234在内存中是4个字节,为 0x34 12 00 00
由LZ打印结果可知,该编译环境储存方式为大端,高位高存,低位低存。所以存储的数据是0X34 12 00 00联合体引用的是同一个地址
氰客 2013-02-23
  • 打赏
  • 举报
回复
引用 3 楼 steedhorse 的回复:
说明你电脑上的处理器是little-endian的,0x34在前,0x12在后。
LZ可了解大小端在内存中存放数据的方式的差异性!
晨星 2013-02-23
  • 打赏
  • 举报
回复
说明你电脑上的处理器是little-endian的,0x34在前,0x12在后。
Aweiwei_ 2013-02-23
  • 打赏
  • 举报
回复
不对,是那个char的ansi码是34和12。。刚看错了
Aweiwei_ 2013-02-23
  • 打赏
  • 举报
回复
数据对齐。。

69,371

社区成员

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

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