有了这些定义:
struct My_Header { uintptr_t bits; }
struct Foo_Type { struct My_Header header; int x; }
struct Foo_Type *foo = ...;
struct Bar_Type { struct My_Header header; float x; }
struct Bar_Type *bar = ...;
这段 C 代码是否正确(“案例一”):
foo->header.bits = 1020;
……其实不一样语义上从这段代码(“案例二”):
struct My_Header *alias = &foo->header;
alias->bits = 1020;
我的理解是它们应该是不同的:
情况一认为该分配无法影响 Bar_Type 中的标头。它仅被视为能够影响其他 Foo_Type 实例中的标头。
情况二,通过强制通过通用别名指针进行访问,将导致优化器意识到对于任何可能包含struct My_Header
。它将与通过任何指针类型的访问同步。(例如,如果您有Foo_Type
这实际上指向的是Bar_Type
,它可以通过标头访问并可靠地找出它所拥有的内容——假设标头位可以告诉您这些信息。)
这依赖于优化器没有变得“聪明”并将情况二恢复为情况一。
代码bar->header.bits = 1020;
完全相同struct My_Header *alias = &bar->header; alias->bits = 1020;
.
严格的别名规则是根据以下定义的访问对象通过lvalues:
6.5p7 对象的存储值应当被访问
只能通过具有以下之一的左值表达式
类型:
唯一重要的是左值的类型以及左值指定的对象的有效类型。不在于您是否将左值派生的某些中间阶段存储在指针变量中。
注意:自从发布以下文本后,该问题已被编辑。以下文本适用于原始问题,其中空间是由malloc
,不是截至 8 月 23 日的当前问题。
关于代码是否正确。你的代码相当于Q80effective_type_9.c
in N2013 修订版 1571 https://www.cl.cam.ac.uk/~pes20/cerberus/notes30.pdf,这是对现有 C 实现的调查,旨在起草改进的严格别名规则。
Q80。将结构写入 malloc 区域后,是否可以通过指向在相同偏移处具有相同叶成员类型的不同结构类型的指针来访问其成员?
绊脚石是代码是否(*bar).header.bits = 1020;
仅设置有效类型int
位;或整个*bar
。相应地,无论是阅读(*foo).header.bits
读到int
,或者它是否读取整个*foo
?
只读一个int
不会是严格的别名违规(可以阅读int
as int
);但读一个Bar_Struct
as Foo_Struct
将构成违规。
本文作者考虑 write 来设置整个的有效类型*bar
,尽管他们没有给出理由,而且我在 C 标准中没有看到任何文本来支持这一立场。
在我看来,目前对于您的代码是否正确没有明确的答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)