获取结构体某成员偏移

Posted 贺二公子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取结构体某成员偏移相关的知识,希望对你有一定的参考价值。

原文地址:https://www.cnblogs.com/HappyAngel/archive/2010/10/29/1864856.html


本身这个问题非常简单,直接用地址差值即可求得,最近在某本书上看到了一个非常牛的方法,第一次看还将信将疑觉得不太可能,后面上机验证发现确实可以,代码如下:

#include <iostream>
using namespace std;

struct test

	int a;
	int b;
	char c;
	int d;
;

#define FIND(structTest,e) (size_t)&(((structTest*)0)->e)

int main()

	size_t s = FIND(test,b);
	//test t;
	cout<<s<<endl;

	char c;
	cin>>c;
	return 0;

仔细看FIND(),发现这个宏非常奇怪,没错,就是用来求偏移的。我们知道宏的本质是替换,在预编译的时候会替换代码,那么里面有什么玄机了?我发现其实此法是用了欺骗编译器的技巧来求得偏移的。取地址符‘&’决定表达式不会出现访问内存错误,因为默认0强制转化为结构体指针类型后是不能访问的地址,由于有地址符,所以不会实际产生访问变量的代码。而‘->’最本质的就是队0加上后面变量在结构体中的偏移,这样 “0 + 偏移”就求得了我们要求的值。感觉此代码非常巧妙,虽然不免有人说是愚弄编译器的伎俩,但是记下无妨,仍然觉得此法的甚妙。

以上是关于获取结构体某成员偏移的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何对结构体某一成员初始化

container_of 和 offsetof宏

如何通过偏移获取/设置结构成员

matlab中怎样读取结构体某字段

C 语言结构体 ( 结构体偏移量计算 | 代码示例 )

C / C ++编译器可以报告结构成员偏移量[重复]