1.作用:
计算结构体内成员的偏移值
2.使用场景:
可在结构体内定义数据结构的节点类型,相当于内嵌数据结构
3.例子(内嵌list数据结构):
例子代码:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct ListNode {
struct ListNode *next;
} ListNode;
struct Demo {
int data;
ListNode node;
};
int main(int argc, char **argv) {
struct Demo demo1 = {1, NULL};
struct Demo demo2 = {2, NULL};
struct Demo demo3 = {3, NULL};
demo1.node.next = &demo2.node;
demo2.node.next = &demo3.node;
ListNode *node = &demo1.node;
while (node) {
struct Demo *demo = (struct Demo*)((char*)node - offsetof(struct Demo, node));
printf("demo data : %d\n", demo->data);
node = node->next;
}
return 0;
}
正常定义ListNode作为简单数据结构List的实现,现在将ListNode定义在Demo中,那么每个Demo中的node按照ListNode数据结构组装,
遍历查询均与Demo无关,只有需要访问到Demo的数据成员时,可直接根据数据结构节点node来通过offsetof得到