本文目录
C语言offsetof和container_of
offsetof
C语言中有这样一个宏 offsetof ,它的作用是计算结构体成员相对于结构体的偏移,原型如下:
参数说明:
原理分析:
偏移 = 成员地址 - 结构体地址 ,若结构体地址为0,则 偏移 = 成员地址 ;
示例:
输出:
container_of
C语言中有这样一个宏 container_of ,它的作用是通过 结构体的成员 , 结构体成员的地址 以及 结构体的类型 来获取结构体的首地址,原型如下:
参数说明:
原理分析:
结构体首地址 = 成员地址 - 成员偏移 , 成员偏移 通过offsetof宏求出;
示例:
输出:
c语言相关问题求教详细一点哈
//代码如下#include《stdio.h》#include《stddef.h》struct s{ char a; int b; long c;};int main(){ printf("结构体s的大小为:%d\n", sizeof(s)); int size_a = sizeof(char); int size_b = sizeof(int); int size_c = sizeof(long); int offset_a = offsetof(s, a); int offset_b = offsetof(s, b); int offset_c = offsetof(s, c); printf("\n其成员偏移量如下:\n"); printf("成员a的大小为%d,偏移量为%d\n", size_a, offset_a); printf("成员b的大小为%d,偏移量为%d\n", size_b, offset_b); printf("成员c的大小为%d,偏移量为%d\n", size_c, offset_c); printf("\n分析空洞:\n"); if (offset_b - offset_a == size_a) printf("成员a与b之间没有空洞.\n"); else printf("成员a与b之间有空洞,空洞大小为%d\n", offset_b - offset_a - size_a); if (offset_c - offset_b == size_b) printf("成员b与c间没有空洞\n"); else printf("成员b与c之间有空洞,空洞大小为%d\n", offset_c - offset_b - size_b); getchar(); return 0;}
//结果如下
c语言标准函数库的stddef.h
NULLNull pointer constant.offsetof(stype, m)Offset (in bytes) of member m from start of structure type stype.ptrdiff_tType for objects declared to store result of subtracting pointers.size_tType for objects declared to store result of sizeof operator.