成员变量在结构体中的偏移——offsetof(type, member)
2016-09-09 15:41
330 查看
转自http://blog.csdn.net/gdutliuyun827/article/details/8440552
size_t offsetof(type, member):看上去像个函数其实这是一个宏;用于求取member成员在类型为type的结构体中的偏移量;(member是type中的一个成员,否则会出错)。
先看一个例子,稍后再看其中的实现。
[cpp] view
plain copy
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
struct s {
int i;
char c;
double d;
char a[];
};
/* Output is compiler dependent */
printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",
(long) offsetof(struct s, i),
(long) offsetof(struct s, c),
(long) offsetof(struct s, d),
(long) offsetof(struct s, a));
printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));
exit(0);
}
编译运行输出结构:
[cpp] view
plain copy
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16
其实现是:
[cpp] view
plain copy
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
看明白了吗?把地址0强制转化为type的类型,然后取member变量的地址,再转为size_t就是偏移量了,size_t其实就是unsigned long类型。
size_t offsetof(type, member):看上去像个函数其实这是一个宏;用于求取member成员在类型为type的结构体中的偏移量;(member是type中的一个成员,否则会出错)。
先看一个例子,稍后再看其中的实现。
[cpp] view
plain copy
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
struct s {
int i;
char c;
double d;
char a[];
};
/* Output is compiler dependent */
printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",
(long) offsetof(struct s, i),
(long) offsetof(struct s, c),
(long) offsetof(struct s, d),
(long) offsetof(struct s, a));
printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));
exit(0);
}
编译运行输出结构:
[cpp] view
plain copy
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16
其实现是:
[cpp] view
plain copy
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
看明白了吗?把地址0强制转化为type的类型,然后取member变量的地址,再转为size_t就是偏移量了,size_t其实就是unsigned long类型。
相关文章推荐
- 成员变量在结构体中的偏移——offsetof(type, member)
- 基于VC++ 6.0下的offsetof(TYPE, MEMBER)个人实验心得
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- offsetof(TYPE, MEMBER)
- C语言中offsetof(TYPE,MEMBER)宏的解释
- offsetof(TYPE, MEMBER)
- offsetof(TYPE, MEMBER) 解释
- offsetof(TYPE, MEMBER)
- PyTypeObject中PyMethodDef结构体和PyMemberDef结构体
- offsetof(TYPE, MEMBER)和 container_of(ptr, type, member)
- offsetof(TYPE, MEMBER)宏和container_of(ptr, type, member)宏的实现
- #define offsetof(TYPE, MEMBER) (size_t)(&(((TYPE*)0)->MEMBER))
- offsetof(TYPE, MEMBER)解释
- offsetof(struct_type, member) : (type *)0
- offsetof(type, member) 问题
- offsetof(TYPE, MEMBER)
- 用offsetof 计算成员变量的偏移,用member_to_object获取容器对象基址
- 条款24:若所有参数皆需要类型转换,请为此采用non-member函数(Declare non-member functions when type conversions should apply to all parameters)
- 结构体获取成员偏移值、结构体内存中字节对齐问题
- 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember。对该方法的声明如下(摘抄于MSDN):