鱼C论坛

 找回密码
 立即注册
查看: 2111|回复: 3

[技术交流] 关于struct 和 printf

[复制链接]
发表于 2016-5-27 14:36:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-2 13:55:44 | 显示全部楼层
machimilk 发表于 2016-5-27 14:51
因为大小端问题, 你这个结构体在内存中占8个字节并且存放是这样的 03 05 06 00 64 00 00 00
因为在32位系 ...

这个对齐有什么风险?可否告知?感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-2 14:57:29 | 显示全部楼层
阁龙1427 发表于 2016-6-2 13:55
这个对齐有什么风险?可否告知?感谢

内存对齐没风险,是为了运行效率,如果你的结构体不是4的倍数,系统会把结构体长度自动增长到4的倍数(除非你人为规定1字节对齐)而结构体你用int指针来指向,这才是问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 04:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表