这种求结构体成员大小的方法你可能没掌握
在C语言编程中,有时候需要知道某结构体中某成员的大小,比如使用堆内存来存储结构体中的某成员时,需要知道该成员的大小,才好确定所需申请的空间大小。求某结构体中某成员的大小,你会怎么做?例子:typedef struct { char a; char c; short b; int d; char e; }test_struct;
求 d 成员所占内存空间的大小。方法一
萌新尝试法…
我们可以先定义一个结构体变量,然后再使用sizeof求出。#include typedef struct { char a; char c; short b; int d; char e; }test_struct; int main(void) { test_struct test_s; printf("sizeof(test_s.d) = %d ", sizeof(test_s.d)); return 0; }运行结果:
但是我们为了得到一个成员的大小,而专门定义一个结构体变量,而这个变量也没有其它的用途,有点浪费资源,或者说这种方法low了。方法二
肉眼观察法…
比如在32bit环境下,我们一眼看出d是int类型,就是4个字节,使用sizeof(int)求出。然后想咋用就咋用。这个简单就不讨论了。方法三
装逼法…代码:#include typedef struct { char a; char c; short b; int d; char e; }test_struct; int main(void) { printf("sizeof(((test_struct*)0)->d) = %d ", sizeof(((test_struct*)0)->d)); printf("sizeof(((test_struct*)0)->a) = %d ", sizeof(((test_struct*)0)->a)); printf("sizeof(((test_struct*)0)->b) = %d ", sizeof(((test_struct*)0)->b)); printf("sizeof(((test_struct*)0)->c) = %d ", sizeof(((test_struct*)0)->c)); return 0; }运行结果:
类似((test_struct*)0)->d这样的用法是个固定用法,把0地址转换为test_struct结构的指针,对于结构体指针,使用->符号就是取其成员,再使用sizeof就可以求得其大小。这里不一定是0地址,其它地址也可以,但一般都会使用0地址。这种方法较方法一的好处就是不用定义一个多余的变量。
这种方法很重要,需要掌握,可能你平时编程不会使用这种方法,但这种方法很重要。在很多优秀的代码中会出现类似形式的宏代码,例如:
上例可封装一个宏定义:#define MEM_SIZE(type, member) sizeof(((type*)0)->member)
求某成员在结构体中的偏移量:#define OFFSETOF(type, member) ( (size_t)( &( ( (type*)0 )->member ) ) )
求结构体偏移量在C语言头文件中stddef.h也有提供,使用方法如:#include #include #define OFFSETOF(type, member) ( (size_t)( &( ( (type*)0 )->member ) ) ) typedef struct { char a; char c; short b; int d; char e; }test_struct; int main(void) { /* stddef.h宏 */ printf("offset(a): %d ", offsetof(test_struct, a)); printf("offset(c): %d ", offsetof(test_struct, c)); printf("offset(b): %d ", offsetof(test_struct, b)); printf("offset(d): %d ", offsetof(test_struct, d)); printf("offset(e): %d ", offsetof(test_struct, e)); /* 自定义宏 */ printf("OFFSETOF(a): %d ", OFFSETOF(test_struct, a)); printf("OFFSETOF(c): %d ", OFFSETOF(test_struct, c)); printf("OFFSETOF(b): %d ", OFFSETOF(test_struct, b)); printf("OFFSETOF(d): %d ", OFFSETOF(test_struct, d)); printf("OFFSETOF(e): %d ", OFFSETOF(test_struct, e)); return 0; }运行结果:
使用这个求结构体偏移量的宏我们就可以很好地知道结构体成员的在内存中的存储情况。关于结构体内存对齐,可移步至往期笔记:经典、易错的结构体内存对齐问题
以上就是本次分享的求结构体成员的三种方法。重点掌握方法三,因为在很多优秀的代码中都有使用到类似的方法。
华为与大众汽车集团供应商达成专利许可协议等7条快讯1华为与大众汽车集团供应商达成专利许可协议华为今天宣布已与大众汽车集团(大众)的一个供应商达成专利许可协议。该协议包括华为4G标准必要专利(SEP)许可,涵盖装有无线连接功能的大众
知情人士透露ModelY大幅降价或因上海政府对赌压力所致电车汇消息7月8日,售价27。6万元的ModelY车型开始正式接受预订,与此前的Model3一样,在推出单电机磷酸铁锂电池版后,售价大幅下降,相对长续航版本,新款ModelY的售价
极氪汽车从吉利汽车拆分,未来或将独立上市电车汇消息近日,极氪汽车(宁波杭州湾新区)有限公司(以下简称极氪汽车)发生股东变动,原大股东吉利汽车集团有限公司(以下简称吉利汽车)从股东中退出,新增股东上海华普国润汽车有限公司(
国轩高科5名董事集体辞职,大众集团高管即将进驻电车汇消息7月6日,国轩高科发布两则公告,因引进战略投资者的需要,5位董事及董事会秘书辞职。在此次变动之后,国轩高科的9位董事仅剩4位,除董事长李缜外,还有2位是目前国轩高科的技术
Sigma全新Standard系列型号登场2018年,以不断推陈出新,挑战自我为目标的品牌,SigmaGuitar既推出SE系列的两款新产品之后,畅销的Standard系列也推出了部分新品。新SE系列介绍SigmaSE系列
万众期待的PRS木吉他巡演来了!什么是民谣时代?为什么会更爱弹木吉他?男(女)朋友VS木吉他选谁?如何演绎一场原声吉他指弹趴?PRS木吉他巡演给你答案3款爱不释手的木吉他能听还能弹,给你双重体验1位东洋大咖前来助
2018马丁吉他大赛指弹组开始投票2018马丁吉他指弹弹唱比赛于7月正式开赛以来,吸引了各地马丁吉他粉丝们的视频投稿,在此感谢全国选手的鼎力支持。四位男神评委说,选手们的水平整体很高,每一位的表现都可圈可点!来吧!
原声吉他史上著名的一支吉他MartinD28Martin的D28可能是原声吉他史上甚至是流行音乐史上最著名的一支吉他了!这是被之后众多原声吉他争相效仿的一个型号,也是任何一位吉他手与音乐人以及音乐爱好者最想拥有的吉他!拿起一
2018PRS木吉他巡演圆满收官2018年6月22日,由雅登音响乐器(上海)有限公司主办的美国PRSSE系列木吉他巡演在北京蜗牛的家拉开帷幕,途径西安杭州共3站,每站上百人次观众到场观看演出。越洋知名指弹艺术家O
VX50AGnutube电子管技术加持的木吉他弹唱音响VOXVX50AG是专用于木吉他和人声扩声的全新音箱产品。体积小巧轻量便携,却拥有惊人的50瓦大功率。采用精心设计的箱体结构和高品质8寸两分频同轴喇叭,不仅音色纯正中性清晰准确,更
首德正一之夜丨徐牧青岛大师班精彩回顾2018年8月16日下午200由德国SAUTER钢琴及青岛正一琴行联合举办的青岛旅德钢琴家徐牧大师班在青岛正一琴行取得圆满成功。数十位学生,家长及钢琴老师聆听了本次由徐牧老师主讲的