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

Does casting to char* and then casting back to original type break strict aliasing?

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

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

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

int *pOriginal = (int *)arr;

是否违规?或者这里有任何未定义的行为?

--

实际上我的疑惑是关于理解 C 标准中的 "effective type"

arr指向的对象是否总是以int为有效类型?

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

这行得通并且定义明确,因为原始指针的对齐将与 int 匹配。

唯一的问题是将 char* 转为 int* 可能是对齐要求。某些体系结构要求 int 在 4 字节边界上对齐(即指针的最后两个二进制数字为 0)。 char* 通常没有这个限制。

但是,由于它以 int* 开始,并且 int* -> char* 从来都不是问题,因此这不会导致任何问题。