显式类型转换

Hap*_*tal 0 c++ types explicit

我在一本书中读到了这一点:

//: C03:SimpleCast.cpp
int main() {
int b = 200;
unsigned long a = (unsigned long int)b;
} ///:~
Run Code Online (Sandbox Code Playgroud)

"强制转换是强大的,但它可能会引起麻烦,因为在某些情况下它会迫使编译器将数据视为(例如)比实际更大,因此它会在内存中占用更多空间;这会占用其他数据这通常在投射指针时发生,而不是在制作如上所示的简单投射时."

现在请你提供一个示例,其中转换指针可以践踏其他数据?

Oli*_*rth 5

int main(void)
{
    short int a = 5;
    short int b = 7;
    *(long int*)&a = 0;
}
Run Code Online (Sandbox Code Playgroud)

假设sizeof(long) > sizeof(short),并且假设编译器a之前放入堆栈b,b将被删除.

  • 如果编译器在a之前将b放在堆栈上,则其他东西将被删除,例如返回地址或调用者保存的帧指针. (2认同)
  • b不保证会被删除.你所做的是一个reinterpret_cast(我总是说,这就是为什么你真的需要使用C++演员,所以你知道你在做什么).取消引用它会导致UB.此外,即使b出现在a之后,也无法保证&b ==&a + sizeof(a). (2认同)