我在 IRC 上与某人进行了讨论,然后出现了这个问题。标准允许我们int
通过char
左值更改类型的对象。
int a;
char *b = (char*) &a;
*b = 0;
如果我们知道对齐没问题,我们是否可以在相反的方向这样做?
我看到的问题是,如果将别名规则视为非对称关系,则别名规则不涵盖以下简单情况
int a;
a = 0;
原因是,每个对象都包含一系列sizeof(obj)
unsigned char
对象(称为“对象表示”)。如果我们更改int
,我们将更改部分或全部这些对象。然而,别名规则只规定我们可以int
用char
or改变 a unsigned char
,但不能反过来。另一个例子
int a[1];
int *ra = a;
*ra = 0;
3.10/15 只描述了一个方向(“包含...的聚合或联合类型”),但这次我们需要另一种方式(“作为元素或非静态数据成员类型的类型总计的...”)。
是否暗示了另一个方向?这个问题也适用于 C。