#define TEST(a,b) ((int) &((a*)0)->b )的解释

时间:2020-03-25 20:35:28   收藏:0   阅读:76

深信服笔试考了这个不会。查了下相关资料,记录一下。

a是某结构体类型

((a*)0)是把一个为0的int变量强转为a*类型

((a*)0)->b是取该指针的成员b

&((a*)0)->b是取成员b的地址

(int)&((a*)0)->b)是将b的地址强转为int。因为之前该指针是强转0来的,所以结构体地址为0,b的地址就是b在结构体中的偏移。

比如:

#include <iostream>
using namespace std;
//调用方式:
#define TEST(a,b) ((int) &((a*)0)->b )
struct A
{
    short a;
    char b;
    short c;
    int d;
};
struct B
{
    char a;
    short b;
    char c;
    int d;
};

int main()
{
    int ret=TEST(A,b);
    int ret2=TEST(B,c);
    cout<<ret<<" "<<ret2;
    getchar();
}

输出:2  4

第一行求类A中b成员的偏移,因为前面只有一个short a,所以为2

第二行求类B中c成员的偏移,前面成员a和b占三个字节,但由于结构体字节对齐,c要从第4字节开始,所以为4

原文:https://www.cnblogs.com/FdWzy/p/12569029.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!