【发布时间】:2014-08-27 05:05:16
【问题描述】:
在these comments 用户@Deduplicator 坚持如果别名或别名指针中的 是指向字符的指针类型(合格或不合格),则严格别名规则允许通过不兼容的类型进行访问, 签名或未签名 char *)。所以,他的断言基本上是两者兼而有之
long long foo;
char *p = (char *)&foo;
*p; // just in order to dereference 'p'
和
char foo[sizeof(long long)];
long long *p = (long long *)&foo[0];
*p; // just in order to dereference 'p'
符合规定并具有明确的行为。
然而,在我的阅读中,只有第一种形式是有效的,也就是说,当 aliasing 指针是指向字符的指针时;但是,一个人不能在另一个方向上做到这一点,即。 e.当别名指针指向不兼容的类型(字符类型除外)时,aliased 指针为char *。
因此,上面的第二个 sn-p 将具有未定义的行为。
这是怎么回事?它是否正确?作为记录,我已经阅读了this question and answer,并且接受的答案明确指出
规则允许
char *例外。始终假定char *为其他类型起别名。 但是这不会以另一种方式工作,没有假设您的结构别名为字符缓冲区。
(强调我的)
【问题讨论】:
-
确实,标准只允许第一个版本。
-
@OliCharlesworth 好吧,我也这么认为。告诉 Deduplicator,他(相当傲慢地)断言“我需要学习更好地阅读标准”...... >.
-
FWIW 相关的 C99 标准条款是 6.5 p7。
-
@Deduplicator:如果你的意思是
char buf[...]; fread(buf, ...); foo(((MyStruct *)buf)->member);,它不起作用。 -
@Deduplicator:对齐是另一回事。请参阅我上面引用的标准报价,了解为什么这对于别名 POV 无效。
标签: c pointers strict-aliasing