是否转换为char *然后转换回原始类型会破坏严格别名?

时间:2015-05-01 04:55:11

标签: c pointers casting strict-aliasing

例如,我将指向int的指针转换为指向char的指针:

int originalVar = 1;
char *arr = (char *)&originalVar;

然后我把它丢回(也许我将arr传递给另一个函数):

int *pOriginal = (int *)arr;

它违反了规则吗?或者这里有任何未定义的行为?

-

实际上我的疑问是关于理解"有效类型"在C标准

arr指向的对象是否始终将int视为其有效类型?

(即使将arr传递给另一个函数?)

1 个答案:

答案 0 :(得分:2)

这是有效的并且定义良好,因为原始指针的对齐将与int匹配。

只发布一个char *到一个int *可以是对齐要求。某些体系结构要求int在4字节边界上对齐(即,指针的最后两个二进制数字为0)。 char *通常没有这个限制。

但是,因为它以int *开头,而int * - > char *永远不是问题,这不会引起任何问题。