C语言中的offsetof宏计算结构体中某变量相对于首地址的偏移

这边直接看代码吧(注释):

include<stdio.h>
#define OFFSETOF(type , n) (int)&(((type*)0)->n)//(type*)0 -- 0是整数的自然起点,这样就就可以以0坐起点来计算偏移量
//定义结构体												//
struct my_str
{
	int a;
	char b;
	float c;
};

int main() {
	printf("a:%d ", OFFSETOF(struct my_str, a));
	printf("b:%d ", OFFSETOF(struct my_str, b));
	printf("c:%d ", OFFSETOF(struct my_str, c));
	//替换后
	printf("c:%d ", (int)&(((struct my_str*)0)->a));
	return 0;
}

解析:

offsetof宏是一个预处理器指令,其功能是计算给定结构体类型中特定成员的偏移量(即字节距离)。

这里的(type*)0是一个技巧性的用法,它将0强制转换为指向type类型结构体的指针。由于0是一个常数,实际上并不会去访问任何实际的内存地址,而是利用这个“伪”指针来获取成员n的地址。接着通过取地址符&得到成员n的地址,最后转换成整型值表示偏移量。

上述代码中,我们定义了一个名为my_str的结构体,包含三个成员:整型变量a,字符变量b和浮点型变量c。通过OFFSETOF宏,我们可以分别获取这三个成员在其所在结构体内的偏移量。

就这么简单思路就是(type*)0 去找结构体得元素就可以计算出偏移量

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普通young man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值