请考虑以下联合类型。
typedef union nodeTypeTag {
nodeEnum nodeType;
ruleNode rule;
conNode cond;
actNode act;
exprNode expr;
litNode lit;
} ASTnode;
其中nodeEnum
是枚举,并且ruleNode
,conNode
,actNode
,exprNode
,litNode
都是结构类型。
现在,假设在我的主要功能中,我这样做:
ASTnode * tmp;
tmp = (ASTnode *) malloc(sizeof(ASTnode));
并假设我还有另一个带有参数的函数:
myfun(conNode * conditions)
如果我将tmp
传递给此函数会怎样?它会出错吗?为什么?会隐式更改指针的类型吗?我是工会类型的新手。
谢谢
答案 0 :(得分:2)
指向ASTnode
(即union nodeTypeTag *
)的指针和指向conNode
(struct *
)的指针不兼容。而通过一个而不是另一个绝对是错误的。
该标准仅表示(C11 6.2.5 28):
所有指向结构类型的指针应具有相同的表示和对齐要求。指向联合类型的所有指针应具有相同的表示和对齐要求。指向其他类型的指针不必具有相同的表示或对齐要求。
但是,联合类型的指针和结构类型的指针对表示和对齐的要求不同。
与此相关的是6.5.7
只能通过具有以下类型之一的左值表达式访问对象的存储值:
—与对象的有效类型兼容的类型,
—与对象的有效类型兼容的类型的合格版本,
试图通过conNode
中的不兼容类型访问类型myfun
的对象是违反上述规则的。