c offsetof-计算结构体内成员的偏移值
2018-03-16 11:55
316 查看
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得到
计算结构体内成员的偏移值
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得到
相关文章推荐
- 计算结构体内成员的内存偏移量
- 计算结构/类中的数据成员的偏移
- 求结构体内成员的偏移和size的宏
- 结构体成员地址在结构体内的偏移
- C语言计算一个结构体内成员地址的偏移量的两种方法(代码实例)
- 如何计算结构体大小和结构体中成员的内存偏移
- 通过结构体某个成员的地址计算结构体首地址[转]
- C++ 指针的偏移 The offset of a pointer in C++
- linux中container_of 用成员指针获得结构体指针
- C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节
- 计算结构体成员地址偏移量...
- C编译器剖析_5.2.3 中间代码生成及优化_通过“偏移”访问数组元素和结构体成员
- list_entry(ptr, type, member)——知道结构体内某一成员变量地址,求结构体地址
- 获取结构体/类 中成员偏移, 另类获取私有成员
- [C/C++标准库]_[初级]_[计算结构体成员的偏移量]
- offset求结构体成员的偏移量
- [C/C++标准库]_[初级]_[计算结构体成员的偏移量]
- 宏定义求结构体内变量偏移
- 通过结构体某个成员的地址计算结构体首地址
- 获取结构体某成员偏移