工会的指针

时间:2019-05-10 03:11:45

标签: c pointers struct union

请考虑以下联合类型。

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

其中nodeEnum是枚举,并且ruleNodeconNodeactNodeexprNodelitNode都是结构类型。

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

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

并假设我还有另一个带有参数的函数:
myfun(conNode * conditions) 如果我将tmp传递给此函数会怎样?它会出错吗?为什么?会隐式更改指针的类型吗?我是工会类型的新手。

谢谢

1 个答案:

答案 0 :(得分:2)

指向ASTnode(即union nodeTypeTag *)的指针和指向conNodestruct *)的指针不兼容。而通过一个而不是另一个绝对是错误的。

该标准仅表示(C11 6.2.5 28):

  

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

但是,联合类型的指针和结构类型的指针对表示和对齐的要求不同。

与此相关的是6.5.7

  

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

试图通过conNode中的不兼容类型访问类型myfun的对象是违反上述规则的。