首页 > 解决方案 > 联合指针

问题描述

考虑下面的联合类型。

typedef union nodeTypeTag {
    nodeEnum nodeType; 
    ruleNode rule; 
    conNode cond; 
    actNode act; 
    exprNode expr; 
    litNode lit; 
} ASTnode;

其中nodeEnumis enum 和ruleNode, conNode, actNode, exprNode,litNode都是结构类型。

现在,假设在我的主要功能中,我这样做:

ASTnode * tmp;
tmp = (ASTnode *) malloc(sizeof(ASTnode)); 

并假设我有另一个带参数的函数:
myfun(conNode * conditions) 如果我传递tmp给这个函数会发生什么?会报错吗?为什么?它会隐式更改指针的类型吗?我对联合类型的想法很陌生。

谢谢

标签: cpointersstructunion

解决方案


指向ASTnode( union nodeTypeTag *) 的指针和指向conNode( struct *) 的指针不兼容。通过一个而不是另一个肯定是错误的。

该标准只说(C11 6.2.5 28):

所有指向结构类型的指针都应具有彼此相同的表示和对齐要求。所有指向联合类型的指针都应具有彼此相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。

但是指向联合类型的指针和指向结构类型的指针没有相同的表示和对齐要求。

这里也相关的是 6.5.7

对象的存储值只能由具有以下类型之一的左值表达式访问:
— 与对象的有效类型兼容的类型,
— 与对象的有效类型兼容的类型的限定版本,

Attempt to access the object of type conNode through a non-compatible type in myfun is a violation of the above rule.


推荐阅读