不匹配的强制转换怎么搞?

看到书上的例子有一句话很不理解,下面是我挑重要的代码用来说明

#include <stdio.h>
int main()
{
    typedef struct ListElmt_{
        void *data;
        struct ListElmt_ *next;
    }ListElmt;
    typedef struct List_{
        ListElmt *head;
        ListElmt *tail;
        int size;
    }List;
    typedef List Set;
    typedef struct KSet_{
        void *key;
        Set set;
    }KSet;

    int b=3;
    ListElmt a={
        &b,
        0
    };
    /*...*/    ((KSet *)(&a)->data)->set;
}

((KSet *)(&a)->data)->set;这句话是把&b传给KSet中的key了吗?set的值是否还未定义?

阅读 2.9k
1 个回答

大爱指针

就你给出的代码做出解释:
((KSet *)(&a)->data)->set;

&a: 很明显, 获取a的地址;
(&a)->data: 获取a.data的值, 即&b;
((KSet *)(&a)->data): 强转a.data/&b的指针类型, 即将a.data/&b指向的数据当做KSet结构解析;
((KSet *)(&a)->data)->set: 按照KSet结构解析获取struct中的set值;
综: 上述的语句其实相当于((KSet *)(&b))->set;

上面的解释完全根据你给出的部分代码, 仅供参考, 如有纰漏请指出.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进