阁龙1427 发表于 2016-5-27 14:36:24

关于struct 和 printf

#include <stdio.h>

struct node
{
         char a;      
         char b;      
         short c;
         int d;
};
int main()
{
         struct node s = { 3, 5, 6, 100 };
         struct node *pt = &s;
         printf("%x\n", *(int*)pt);//60503
         exit(0);
}


为什么输出60503 而不是 10060503 也不是 30506100

machimilk 发表于 2016-5-27 14:51:21

因为大小端问题, 你这个结构体在内存中占8个字节并且存放是这样的 03 05 06 00 64 00 00 00
因为在32位系统中 char 占1字节 03 然后还是char 就变成03 05 然后是short 2字节 因为大小端问题
现在就变成03 05 06 00 后面是4字节的int 100 就是64 00 00 00 组合在一起就是03 05 06 00 64 00 00 00
因为结构体还存在对齐的问题,但是你这个结构体正好占8字节(4的倍数),所以没影响
但是你printf的时候把按int打印的,这样就指向了03 05 06 00,后面的4字节舍去了,你又按hex打印的,所以打印应该是00 06 05 03 然后前面的0舍去就变成最终的60503了

阁龙1427 发表于 2016-6-2 13:55:44

machimilk 发表于 2016-5-27 14:51
因为大小端问题, 你这个结构体在内存中占8个字节并且存放是这样的 03 05 06 00 64 00 00 00
因为在32位系 ...

这个对齐有什么风险?可否告知?感谢

machimilk 发表于 2016-6-2 14:57:29

阁龙1427 发表于 2016-6-2 13:55
这个对齐有什么风险?可否告知?感谢

内存对齐没风险,是为了运行效率,如果你的结构体不是4的倍数,系统会把结构体长度自动增长到4的倍数(除非你人为规定1字节对齐)而结构体你用int指针来指向,这才是问题
页: [1]
查看完整版本: 关于struct 和 printf