c语言题目,请问为什么m.c是78,求详细解答
发布网友
发布时间:2022-04-29 07:25
我来回答
共3个回答
热心网友
时间:2022-06-21 03:08
这说明你用的平台是所谓“小端机”,即一个整数是从变量地址的低字节形如依次存放的。在本例中给联合体变量m只根本了4个字节(最长的long int类型),在用m.b=0x12345678;为m.b赋值时,内存中从&m.b开始的由低到高的地址中依次存放0x78、0x56、0x34、0x12,而m.c只有一个字节,这个字节就是&m.b,所以输出是78。如果你用的平台是所谓“大端机”,输出就应该是12了……
热心网友
时间:2022-06-21 03:09
这需要了解union的内存分布是怎么样的。
union是所有字段共用一段内存空间,其大小等于最大的那个字段的大小,且所有字段的起始地址一样。
在VC++中,你题中的这个m的大小是4字节,因为最大的字段是a和b都是占用4个字节。由于VC++中是小端序,故其实b的第一个字节是0x78,由于c与a、b共用内存空间,且c与a、b的起始内存地址又一样,所以c其实就是b的第一个字节,也就是0x78。
其实这道题中,在VC环境下:
m.a == 0x12345678
m.b == 0x12345678
m.c == 0x78
如果是在64位的Linux下,情况会有所不同,因为64位Linux下long类型是8个字节的,但a、b、c的值还是和上面说的一样。
热心网友
时间:2022-06-21 03:09
在C Programming Language 一书中对于联合体是这么描述的:
1)联合体是一个结构;
2)它的所有成员相对于基地址的偏移量都为0;
3)此结构空间要大到足够容纳最"宽"的成员;
4)其对齐方式要适合其中所有的成员
在32 位的系统上
int 咔出来的内存大小是4 个byte;
long 咔出来的内存大小是4 个byte;
char 咔出来的内存大小是1 个byte。
也就是说联合体的成员占用共同的一段内存。所以联合体m的大小只有4字节
sizeof(union m) = 4;而m.c 只占低地址的一个字节所以是 78