【发布时间】:2011-01-21 13:22:04
【问题描述】:
我在 IRC 上与某人进行了讨论,然后出现了这个问题。标准允许我们将int 类型的对象更改为char 左值。
int a;
char *b = (char*) &a;
*b = 0;
如果我们知道对齐没问题,我们是否可以在相反的方向执行此操作?
我看到的问题是,如果将别名规则视为非对称关系,则别名规则不涵盖以下简单情况
int a;
a = 0;
原因是,每个对象都包含一系列sizeof(obj)unsigned char 对象(称为“对象表示”)。如果我们更改int,我们将更改部分或全部这些对象。但是,别名规则仅规定我们可以将int 更改为char 或unsigned char,但不能反过来。另一个例子
int a[1];
int *ra = a;
*ra = 0;
3.10/15 只描述了一个方向(“包含...的聚合或联合类型”),但这次我们需要另一种方式(“作为元素或非静态数据成员的类型聚合的类型...")。
是否暗示了另一个方向?这个问题也适用于 C。
【问题讨论】:
-
您能否添加一些代码来说明“相反方向”的含义?您认为哪些代码可能不被允许?
-
@Rob 我以为我展示了。也许我失败了。可能不允许
a = 0以及*ra = 0。对于“A foo contains bar”的“相反方向”,我的意思是“A bar包含在 foo”中。有什么特别不清楚的? -
如果你的意思是,
char a='A'; int *pi = (int*)a; *pi='B';,那么我认为开始这样的事情并不安全。
标签: c++ c pointer-aliasing symmetric unsigned-char