首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言(打包,压实!)

C语言(打包,压实!)

作者头像
用户2617681
发布2019-08-08 12:53:52
6920
发布2019-08-08 12:53:52
举报
文章被收录于专栏:秘籍酷秘籍酷

有个GNU的关键字,出现在了几天前的文章《算法(BMP图像格式处理)》中,当时提了一下,蛋感觉没有敲黑板划重点,很多小朋友估计没咋注意,这就好比衣角的两块钱,平时不起眼,不在意,不爱她,万一外出没车没人没带包,只能坐公交,两块零钱可是回家的救命稻草。

这个GNU关键字是:__attribute__((packed()))

上次是怎么用他的来着?想起来了,就是当我们定义一个结构体,来存储BMP格式头数据信息的时候,比如:

struct header { int16_t type; int32_t size; int16_t reserved1; int16_t reserved2; int32_t offbits; }__attribute__((packed));

如果定义该结构体的时候,不使用packed关键字,那么系统将会根据CPU字长将结构体内部的各个成员的地址对齐,地址对齐的结果会导致有些成员变量的后面需要填补一些0,也就是说:结构体的总大小,可能会大于每一个成员的大小之和。

这个过程就好比顺丰快递员打包包裹,当你寄送的东东无法刚刚好填满整个箱子的时候,他为了防止运送过程中的震荡损坏物件,会塞一些泡沫、空气囊等填充物进去一样。

为了这个我还专门p了个图,呐,就像这样子:

这个填充一些东西的做法,一般情况下都是好的,在移植类代码中甚至是必须的。但是如果你想要让结构体的大小严格等于每个成员之和,就不能这么做了,而必须加上 __attribute__((packed))。就像读取BMP文件的格式头的例子,如果没使用这个关键字,你将会读到比所实际所需的更多的字节,结果当然就不对了。

关键是以上错误非常隐蔽,如果老师傅不说破,小学徒是不是要跑断腿?

对了,说话快递空气缓冲袋哪家强? 我只信浦帝空气袋,什么?哪里有得买?戳这里就可以了:https://detail.tmall.com/item.htm?spm=a220m.1000858.0.0.yTWPyu&id=538902580360&areaId=440100&is_b=1&cat_id=2&q=%BB%BA%B3%E5%B4%FC

链接点不进去? 哈哈哈很正常。没听过微信还会给阿里开放接口的。真要买的话,直接上天猫搜索浦帝,或者直接点击左下角“阅读原文”即可!!!但话说回来,你买空气袋做什么???

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档