P-结构体成员的偏移量---宏定义实现

本文探讨了如何在不实例化结构体的情况下,利用宏定义求解C++结构体成员的偏移量。这个问题源于一次Tencent的电话面试,面试中面试官提出了一个算法题,要求通过宏定义来实现。虽然作者当时未能给出答案,但后来在《程序员面试宝典》中找到了相关解答。常见的解释是,通过`(StructType *)0`获取成员的地址实际上是编译器根据结构体的内存布局在编译时期计算的,避免了非法访问。期待更深入的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在找实习,前天接到Tencent的电话面试,有点小激动,一点准备都没有,站在实验室外楼梯边的窗户旁就这么开始了,一开始自我介绍,然后主要问了一下项目情况,后来就是基本的常识性的编程知识,最后问了一道算法题,在面试官的提醒下,最后基本都算答出来了,但有一题,尼玛我实在想不出来,也就没答出来,问题是:怎样求结构体成员的偏移量

我的第一反应是:定义结构体成员,然后取地址,求差值,然后面试官来了一句:不许实例化,定义一个宏来实现。尼玛,我当时就懵了,不实例化,让我怎么搞。。。然后我苦思冥想了几分钟,然后说这个我真不知道。。。面试官说那咱就换个问题吧。。。生气

今天把那天面试问的问题整理了一下,尼玛我居然发现这个问题在《程序员面试宝典》P45,原题。。。,先把结果贴出来:

#define STRUCT_MEMBER_OFFSET(StructType, memberName) (size_t)&(((StructType *)0)->memberName) 
首先看到这个结构我的第一反应就是:我次奥。。。,空指针怎么可以访问结构体的成员,为什么,空指针是不能访问任何成员的。

看到网上千篇一律的说:如果通过(StructType *)0访问该结构体的成员肯定是非法的,而(size_t)&(((StructType *)0)->memberName)的实际意图并非想取memberName字段的内容,而是计算当前结构体首地址为(StructType *)0时,memberName字段的地址。

但是我想说的是根据这个表达式的写法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值