结构体成员偏移地址
精选 转载中午,一位同事问我一个问题把我问住了:
#define MY_OFFSET(MyStruct,MyField) (size_t)&(((MyStruct*)0)->MyField)。
使用这个语句编写代码为什么不发生错误。是啊,为什么“((MyStruct*)0)->”这么用都不崩溃呢?
上面定义的MY_OFFSET宏就是要的MyField的偏移。这样强制转换后的结构指针怎么可以用来访问结构体字段?其实这个表达式根本没有也不打算访问MyField字段。ANSI C标准允许任何值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((MyStruct*)0)的结果就是一个类型为MyStruct*的NULL指针。如 果利用这个NULL指针来访问MyStruct的成员当然是非法的,但&(((MyStruct*)0)->MyField)的意图并非想 存取MyField字段内容,而仅仅是计算当结构体实例的首址为((MyStruct*)0)时MyField字段的地址。
如上做法避免了一定要实例化一个MyStruct对象,并且求值是在编译期进行,没有运行期负担。
当然,还有其他方法可以算出结构体成员的偏移地址,但无疑这种方法是上佳之选.:)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
结构体大小计算-结构体对齐
计算某一结构体大小:方法以及规则。
偏移量 #pragma 结构体 结构体大小计算 -
计算结构体成员在结构体中的偏移量
一 方式1:采用offsetof宏#include <stdio.h>#include <stddef.h
c++ c语言 位域 编译器 #include -
访问结构体成员
如何访问结构体中的成员
操作符 结构体指针 结构体 访问成员 -
【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
一、指针运算 与 指针内存操作、二、结构体偏移量计算
c语言 指针运算 指针内存操作 结构体偏移量 原力计划 -
结构体成员变量
结构体成员变量
赋值 初始化 实例变量 成员变量 #import