×

offsetof函数 c语言

offsetof函数 c语言(C语言offsetof和container_of)

admin admin 发表于2024-05-13 19:33:48 浏览27 评论0

抢沙发发表评论

大家好,关于offsetof函数 c语言很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于C语言offsetof和container_of的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

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.

C语言offsetof和container_of的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于C语言offsetof和container_of、C语言offsetof和container_of的信息别忘了在本站进行查找哦。