c - 联合指针
问题描述
考虑下面的联合类型。
typedef union nodeTypeTag {
nodeEnum nodeType;
ruleNode rule;
conNode cond;
actNode act;
exprNode expr;
litNode lit;
} ASTnode;
其中nodeEnum
is enum 和ruleNode
, conNode
, actNode
, exprNode
,litNode
都是结构类型。
现在,假设在我的主要功能中,我这样做:
ASTnode * tmp;
tmp = (ASTnode *) malloc(sizeof(ASTnode));
并假设我有另一个带参数的函数:
myfun(conNode * conditions)
如果我传递tmp
给这个函数会发生什么?会报错吗?为什么?它会隐式更改指针的类型吗?我对联合类型的想法很陌生。
谢谢
解决方案
指向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.
推荐阅读
- c++ - 命名空间“std”中没有名为“hardware_constructive_interference_size”的成员
- out-of-memory - 无法在 informix 12.10 中写入已排序的行
- c# - INNER JOINS 和 LEFT JOINS 的 EF Core 难度
- typescript - 在 prisma 种子中使用 nestJS 模块的服务
- javascript - 插入一个具有相同级别的数组
- django - 如何在 sqliteonline 上查看 django 数据库
- google-calendar-api - 如何从谷歌日历api获取特定项目数据
- r - 在 MacOS 10.15 上编译 Rcpp 代码时出错:“找不到符号:___addtf3”
- python - 从 BeautifulSoup 中的特定“dd”标签打印出文本似乎会打印出所有这些。我怎样才能防止这种情况?
- pandas - 如何按列中的字符串值对数据框进行排序