转换为 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* 从来都不是问题,因此这不会导致任何问题。
例如,我将指向 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* 从来都不是问题,因此这不会导致任何问题。