在C语言中,有这样一个特殊的宏,叫offsetof,它的功能是啥呢?...(struct struct_test,fild1), offsetof(struct struct_test,fild2), offsetof(struct struct_test...,fild3), offsetof(struct struct_test,fild4), offsetof(struct struct_test,fild5)); return...offsetof要求的是返回结构图成员相对于起始地址的偏移量,这是不是意味着我们还得求出结构体首地址才能实现呢?其实不用,我们只需要将起始地址设为0不就行了?...#define offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName)
(S2, singlechar) is %d/n”, offsetof(S2, singlechar)); printf (“offsetof(S2, arraymember) is %d/n”, offsetof...(S2, arraymember)); printf (“offsetof(S2, anotherchar) is %d/n”, offsetof(S2, anotherchar)); printf...(S, ID) is %d/n”, offsetof(S, ID)); printf (“offsetof(S, addr) is %d/n”, offsetof(S, addr)); printf...(“offsetof(S, name) is %d/n”, offsetof(S, name)); printf (“s.ID’s address : %x/ns.addr’s address :...(S1, employee) is %d/n”, offsetof(S1, employee)); printf (“offsetof(S1, title) is %d/n”, offsetof(S1
11中,要求这个类standard_layout 基本用法是这样子的: #include /* printf */ #include /* offsetof...*/ struct foo { char a; char b[10]; char c; }; int main () { printf ("offsetof(struct...foo,a) is %d\n",(int)offsetof(struct foo,a)); printf ("offsetof(struct foo,b) is %d\n",(int)offsetof...(struct foo,b)); printf ("offsetof(struct foo,c) is %d\n",(int)offsetof(struct foo,c)); printf...这就是offsetof大显身手的时候了,有了它,我们在知道成员地址之后,能求出page实例的基地址,从而 变相的实现了将两个page连接在一起的目的,同时复用了双链表这一基本数据结构。
其中解释如下: #define offsetof(type, member) __builtin_offsetof (type, member) 自己分析:即:__builtin_offsetof(...__builtin_offsetof(a,b)和offsetof(TYPE,MEMBER)本质一样的,只是 offsetof()宏是由程序员自己来设计(详见后面讲解)。...—- #undef offsetof #ifdef __compiler_offsetof #define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE...若已经内建了这样的宏,则 offsetof()就是使用这个内建宏__compiler_offsetof()即:__builtin_offsetof()宏。...如果没有定义 __compiler_offsetof()宏,则offsetof()宏就由程序员来设计之。 2.对offsetof()宏的分析:(以下引用论坛)—曾经的腾讯QQ的笔试题。
const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof...(type,member) );}) 其次为 offsetof 函数原型: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)...好吧,一不小心把 offsetof() 函数的功能给讲完了: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 所以offsetof...const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof
#include size_t offsetof ( type, member ) #define offsetof ( TYPE, MEMBER) \...typedef struct { int a; int b; int c; int d; } PAD_t; offsetof...根据需要,(TYPE *)0 可以改为非0地址,例如(TYPE *)100,此时 offsetof (PAD_t, d) 返回112.
大家好,又见面了,我是你们的朋友全栈君offsetof,程序语言,该宏用于求结构体中一个成员在该结构体中的偏移量。...size_t offsetof( structName, memberName ); 第一个参数是结构体的名字,第二个参数是结构体成员的名字。...\n”, offsetof(struct address, name)); printf(“address 结构中的 street 偏移 = %d 字节。...\n”, offsetof(struct address, street)); printf(“address 结构中的 phone 偏移 = %d 字节。...\n”, offsetof(struct address, phone)); return(0); } 运行结果: address 结构中的 name 偏移 = 0 字节。
前言 问题出现于实际工作当中,最近代码里引进了一个宏offsetof(s,m),这个宏的实际作用就是用来计算结构中的某个变量在结构中的偏移量的,实际的项目是跨平台的,原来一直在windows上开发,今天发现在...#else #ifdef _WIN64 #define offsetof(s,m) (size_t)( (ptrdiff_t)&(((s *)0)->m) ) #else #define offsetof...(STest, nValue1); int n2 = offsetof(STest, nValue2); int n3 = offsetof(STest, nValue3); int n4 = offsetof...测试结果 分析 这个警告中的NULL比较扎眼,考虑把它搞掉们是不是只有NULL才会报警告呢,参考了其他平台和工具的offsetof宏定义,决定把当前环境中的offsetof宏定义改一下: #define...offsetof(s,m) (size_t)&reinterpret_cast((((s *)0)->m)) 改成 #define offsetof(s,m
前言 本文介绍并模拟实现宏offsetof ---- offsetof介绍 格式:offsetof(type, member) 头文件: 这个宏有两个参数: type是一个结构体类型或联合类型...#define OFFSETOF(type, member) (size_t)( &( ( ( type* )0 ) -> member) ) 把整数0强制类型转换为type*类型,相当于一个结构体的起始地址位于...->member)) struct S { int a;//0~3 char b;//4 //5 short c;//6~7 }; int main() { printf("%d\n", offsetof...(struct S, a)); printf("%d\n", offsetof(struct S, b)); printf("%d\n", offsetof(struct S, c)); printf...("%d\n", OFFSETOF(struct S, a)); printf("%d\n", OFFSETOF(struct S, b)); printf("%d\n", OFFSETOF(struct
到这里,有人可能会想到offsetof(那些没用过甚至没见过的朋友别急,后面马上会详解offsetof)来解决这个问题: /*offsetof获取数据成员在数据结构中的偏移量 比如成员f在...我想那些对 offsetof有较深理解的同志一定会这么办: /*类似于offsetof的定义*/ #define SIZEOF(s,m) ((size_t) sizeof(((s *)0)...offsetof对那些搞 C++ 的人可能很熟悉,因为offsetof类似于sizeof,也是一种系统操作符,你不用考虑它是怎么定义的。...在嵌入式系统里,不同开发商,不同架构处理器和编译器都有不同的offsetof定义形式: /* Keil 8051 */ #define offsetof(s,m) (size_t)&((.../* GNU GCC 4.0.2 */ #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) 虽然定义形式不同,
宏offsetof 标准库stddef.h 定义 size_t offsetof(type, member); 分析 C 库宏 offsetof(type, member) 会生成一个类型为 size_t...下面的实例演示了 offsetof() 宏的用法。...\n”, offsetof(struct address, name)); printf(“address 结构中的 nationality 偏移 %d 字节。...\n”, offsetof(struct address, nationality)); printf(“address 结构中的 phone 偏移 %d 字节。...应用 在实际的使用中,比较经典的情况:已知一个已经分配空间的结构体对象指针A中的某个成员B,使用offsetof宏,可根据B在A中的偏移量,获取该结构体指针对象A的首地址,从而进一步使用A。
废话不多说,今天要说的两个宏分别是offsetof和container_of,第一个宏是用来计算结构体中某个成员相对于结构体的偏移量,第二个宏是已知指向结构体某个成员的指针,来计算结构体的指针。...一、offsetof 这个宏是用来计算结构体某个成员的偏移量的,所以我们先来定义一个简单的结构体类型,来说明。...二、container_of 上面介绍了offsetof宏的使用,相信不是那么难理解,那么这个宏就看起来复杂多了,但是,其实只要把思路理清楚了,也不是那么复杂。...((char *)__mptr -offsetof(type, member));将指针转化为char类型,并且减去偏移量。...(type *)((char *)__mptr -offsetof(type, member));最后将获取的指针再转化为type类型。 可能前面几句可以理解,后面就糊涂了。
一、offsetof宏的介绍 offsetof宏的作用是获取结构体中某个成员相对于结构体起始地址的偏移量。通过计算成员在结构体中的位置,它提供了一种可移植的方法来确定偏移量。...头文件 : offsetof宏的通用形式: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 参数说明:...(struct ST, b)); printf("%zd\n", offsetof(struct ST, c)); return 0; } 二、offsetof宏的实现 (这里用一些更简短的符号表示...c; }; int main() { printf("%zd\n", MY_offsetof(struct ST, b)); printf("%zd\n", MY_offsetof(struct...编译时计算:offsetof宏是在编译时计算偏移量的,因此它不能用于运行时动态生成的结构体类型或成员名。
上代码: offsetof_test.h头文件 /* * offsetof_test.h * * Created on: Jul 9,...-o offsetof_test.o gcc -o main offsetof_test.o ....利用已知地址和offsetof来转换一个结构体的首地址 offsetof_test.h /* * offsetof_test.h * * Created on: Jul 9, 2014 *...(); #endif /* OFFSETOF_TEST_H_ */ offsetof_test.c /* * offsetof_test.c * * Created on: Jul 9, 2014...(); return 0; } 编译: gcc -c offsetof_test.c -o offsetof_test.o gcc -o main offsetof_test.o .
个人主页:修修修也 所属专栏: ⚙️操作环境:Visual Studio 2022 一.offsetof简介 因此,宏offsetof的作用是: 当你传入结构体的类型及其成员时,它会返回该成员在结构体中的偏移量...二.offsetof的使用 如下,我们使用offsetof打印一下结构体foo中,成员a,成员b及成员c相对于首地址的偏移量分别是多少: #include #include...printf ("offsetof(struct stu,ch) is %d\n",(int)offsetof(struct stu,ch)); printf ("offsetof(struct...stu,sz) is %d\n",(int)offsetof(struct stu,sz)); printf ("offsetof(struct stu,age) is %d\n",(int)offsetof...offsetof(struct stu,age) is 8 我们画图验证一下: 三.offsetof的实现 库函数中对offsetof的实现是这样的: #define OFFSET(type,member
(type_, member_))) 一下子就明白了,是通过offsetof这个宏来获取到内部成员在结构体内的偏移量,然后进而来获取整个结构体的地址。...("struct test: offset c %d\n", (int) offsetof(struct test, c)); printf("struct test: offset d %d\...n", (int) offsetof(struct test, d)); printf("struct test2: offset a %d\n", (int) offsetof(struct...test2, a)); printf("struct test2: offset b %d\n", (int) offsetof(struct test2, b)); printf("...a %d\n", (int) offsetof(struct test3, a)); printf("struct test3: offset b %d\n", (int) offsetof(
文章目录 回顾 问题具象化 上工具 offsetof 实例分析 container_of 实例解析 offsetof 原理 container_of 原理 参考 回顾 上一篇我们讲到内核链表和普通链表的区别...(type,member) );}) 简单介绍下: offsetof 宏用来计算某个成员变量在结构体中的偏移量。...offsetof 实例分析 #include #include #include #define offsetof(TYPE, MEMBER...offsetof 原理 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 对于这个宏,我们逐层去理解 1....(type *)( (char *)__mptr - offsetof(type,member) ); 1、2、3、 同 offsetof 4、typeof 获取变量类型 5、使用获取到的类型定义一个临时指针变量
一、函数原型 #include size_t offsetof(type, member); offsetof原型定义:define offsetof(t,m) ((size_t)...}; /* 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
(struct Demo, a), (long)offsetof(struct Demo, b), (long)offsetof(struct Demo, c), (long)offsetof...7) #define offsetof(s,m) (size_t)(unsigned long)&(((s *)0)->m) // Diab Coldfire compiler #define offsetof...defined _CRT_USE_BUILTIN_OFFSETOF #ifdef __cplusplus #define offsetof(s,m) ((::size_t)&reinterpret_cast...#endif #else #define offsetof(s,m) __builtin_offsetof(s,m) #endif 无论实现如何,offset 宏采用两个参数。...(struct Demo, a), (long)offsetof(struct Demo, b), (long)offsetof(struct Demo, c), (long)offsetof
container_of 在已知一个结构体的成员的名字,以及其地址的情况向,反推该结构体的首地址 offsetof 获取一个结构体成员在结构里面的偏移,结构体首地址 = 成员地址- 成员偏移 以下是一个...container of函数例子: #include #include #define offsetof(TYPE,MEMBER) ((int) &((...type , member) ({ \ const typeof(((type *)0)->member) *__mptr = (ptr) ; \ (type *)((char *)__mptr - offsetof...(type,member));}) #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) typeof 获取成员类型 const...#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 成员member 在结构体TYPE中的相对地址 ptr - offset
领取专属 10元无门槛券
手把手带您无忧上云