大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
宏offsetof
标准库stddef.h
定义 size_t offsetof(type, member);
分析
C 库宏 offsetof(type, member) 会生成一个类型为 size_t 的整型常量,它是一个结构成员(member)相对于结构(type)开头的字节偏移量。成员是由 member 给定的,结构的名称是在 type 中给定的。
type — 这是一个 参数class类型,是结构体的名字,第二个参数member是结构体成员的名字,是一个有效的成员指示器。该宏返回结构体class中成员member的偏移量。偏移量是size_t类型的。
member — 这是一个 class 类型中的成员指示器,就是指定的class里的一个成员量。通常通过member得到type的起始地址,即指向type类型的指针。
该宏返回类型为 size_t 的值,表示 type 中成员的偏移量,是一个无符号整数类型数值,是 sizeof 关键字的结果。需要注意的是,这里在实际环境中会涉及到C语言内存对齐机制。
下面的实例演示了 offsetof() 宏的用法。
#include
#include
struct address {
char name[50];
char nationality[50];
int phone;
};
int main()
{
printf(“address 结构中的 name 偏移 %d 字节。\n”,
offsetof(struct address, name));
printf(“address 结构中的 nationality 偏移 %d 字节。\n”,
offsetof(struct address, nationality));
printf(“address 结构中的 phone 偏移 %d 字节。\n”,
offsetof(struct address, phone));
return(0);
}
编译并运行上面的程序,这将产生以下结果:
address 结构中的 name 偏移 0 字节。
address 结构中的 nationality 偏移 50 字节。
address 结构中的 phone 偏移100 字节。
应用
在实际的使用中,比较经典的情况:已知一个已经分配空间的结构体对象指针A中的某个成员B,使用offsetof宏,可根据B在A中的偏移量,获取该结构体指针对象A的首地址,从而进一步使用A。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/172109.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...