C++ - reinterpret_cast 的指向基元指针的安全性

C++ - Safety of reinterpret_cast for pointer-to-primitives

我在评估的项目中遇到了一段代码,想知道以下转换是否安全:

void func(unsigned long* input);
...
int data = 42;
func(reinterpret_cast<unsigned long*>(&data));  
// Casting to remove compiler warnings about data type not matching type expected

我知道仅使用简单的 C 样式转换(即:(unsigned long*)&data)这是自找麻烦。 reinterpret_cast 会自动使这种类型的铸造操作安全吗?

谢谢。

不,这不安全:程序行为未定义。

这是因为指针类型不相关。

任何 C 风格的转换都会被解释为特定的 C++ 风格的转换。 C 风格的转换 (unsigned long*)&data 实际上意味着 reinterpret_cast<unsigned long*>(&data)。当其中一个不安全时,其中一个是安全的是不可能的。

你是对的,这是不安全的。严格来说,问题通常不是演员阵容本身,尽管也有可能。如果 data 没有为 unsigned long 正确对齐,则转换本身只是一个问题。这实际上是通过错误类型进行的后续访问,这才是问题所在。您没有在您的问题中显示该访问权限,但除非 func 只是将 input 强制转换回 int *char *,否则这将是一个问题。如果 func 确实像那样将其转换回去,那么它应该声明为采用正确的类型。