在指向工会成员的指针之间进行转换

时间:2020-10-01 04:03:12

标签: c pointers

如果我有工会

union U {
  int i;
  double d;
};

然后我可以获取指向对象成员的指针

U u;
int *ip = &u.i;
double *dp = &u.d;

我阅读标准

C11,6.7.2.1§16:工会的规模足以容纳其最大的成员。成员中最多一个的值可以随时存储在联合对象中。 指向经过适当转换的并集对象的指针指向其每个成员(或者,如果成员是位域,则指向它所驻留的单元),反之亦然。

U u;
int *ip = (int *)&u;
double *dp = (double *)&u;

这是正确的读数吗?

如果是,那么

C11,6.3.2.3§7 指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未针对引用类型正确对齐,则该行为未定义。否则,再次转换时,结果应与原始指针进行比较。将对象的指针转换为字符类型的指针时,结果指向对象的最低寻址字节。结果的连续递增(直到对象的大小)会产生指向对象剩余字节的指针。

允许我也这样做吗?

int *ip2 = (int *)dp;
double *dp2 = (double *)ip;

如果并列位置对齐以便可以包含其成员,则它必须同时与intdouble对齐,因此在那里没有问题,但是我也可以将标准理解为关于指针正确对齐,而不是它指向的对象。

我想第一段并没有说我可以将成员指针 back 转换为联合体

U *up1 = (union U *)ip;
U *up2 = (union U *)dp;

所以我想我不能保证这会给我up1 == up2吗?因此,我什至不能保证我可以编写这个丑陋的代码并符合标准。

int *ip2 = (int *)((union U *)dp);
double *dp2 = (double *)((union U *)ip);

也就是说,除非第二段说过,因为我从并集对其他类型进行了强制正确对齐,否则我将获得正确的指针。但是我不确定我可以用这种方式解释它,出于同样的原因,我不确定我是否可以在指向成员的指针之间进行转换。

我是否允许将指向联合的指针转换为其成员之一类型的指针?然后允许我将该指针强制转换为具有另一成员类型的指针吗?

我不会用这些知识来做特别疯狂的事情,我只是想知道什么时候我读到了一个稍微白痴的案例的标准...

0 个答案:

没有答案
相关问题