我不知道为什么下面的代码工作正常,没有gcc
错误(-fstrict-aliasing -Wstrict-aliasing=1
)。
#include <stdio.h>
int
main(void)
{
char n = 42;
char *p = &n;
int *q = (int *)p;
*q = 10;
printf("%d|%d\n", *p, *q);
return 0;
}
如果我遵循严格的别名规则:
n1570, § 6.5 表达式
对象的存储值只能由具有以下类型之一的左值表达式访问:
— 与对象的有效类型兼容的类型,
— 与对象的有效类型兼容的类型的限定版本,
— 与对象的有效类型相对应的有符号或无符号类型,
— 对应于对象有效类型的限定版本的有符号或无符号类型,
— 在其成员中包含上述类型之一的聚合或联合类型(递归地,包括子聚合或包含联合的成员),或
— 一种字符类型。
但*q
不具有与 兼容的类型*p
,要么是限定版本,要么是对应的有符号或无符号类型,要么是字符类型。
那么,为什么允许呢?