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

标签 c pointers casting strict-aliasing

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

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

然后我将其转换回来(也许我将 arr 传递给另一个函数):

int *pOriginal = (int *)arr;

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

--

其实我的疑惑在于理解C标准中的“有效类型”

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

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

最佳答案

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

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

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

关于c - 转换为 char* 然后转换回原始类型是否会破坏严格别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981787/

相关文章:

尝试解析十六进制字符串时崩溃

c++ - 如何使这个运算符(operator)调用明确?

c++ - C2059 : syntax e r r o r : ';'

c - 使用额外引用和取消引用进行转换时的行为

java - 在 Java 中从 MongoDB 读取 Integer 字段时出现长类型转换错误

c 管道、stdin/stdout 和排序

c - 错误 : array subscript is not an integer

c - 如何在 Rust 中获取 C 指针的所有权并适本地删除它?

Python Ctypes 传递 .h 文件中定义的结构指针。

c++ - 将 BloombergLP::blpapi::Name 转换为 const char *