读书人

关于union的内存储器分配

发布时间: 2013-02-27 10:48:11 作者: rapoo

关于union的内存分配

#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呢?
[解决办法]
说明你电脑上的处理器是little-endian的,0x34在前,0x12在后。
[解决办法]
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

[解决办法]
引用:
int 0x1234在内存中是4个字节,为 0x34 12 00 00


由LZ打印结果可知,该编译环境储存方式为大端,高位高存,低位低存。所以存储的数据是0X34 12 00 00联合体引用的是同一个地址

读书人网 >C语言

热点推荐