我在一本书中读到了这一点:
//: C03:SimpleCast.cpp
int main() {
int b = 200;
unsigned long a = (unsigned long int)b;
} ///:~
“施放是强大的,但它可能会导致头痛,因为在某些情况下 这种情况迫使编译器将数据视为(对于 实例)比实际大,所以它会占用更多的空间 记忆;这可以践踏其他数据。这通常会发生 在投射指针时,而不是在制作像这样的简单投射时 如上所示。“
现在请你提供一个示例,其中转换指针可以践踏其他数据吗?
答案 0 :(得分:5)
int main(void)
{
short int a = 5;
short int b = 7;
*(long int*)&a = 0;
}
假设sizeof(long) > sizeof(short)
,假设编译器在a
之前将b
放在堆栈上,b
将被删除。
答案 1 :(得分:1)
int main() {
char a[] = "This is a string.";
*(long *)a = 12345678; // will typically overwrite first four or eight bytes of a.
std::cout << a;
return 0;
}
答案 2 :(得分:0)
char unix[5]="unix";
char* first= &(unix[0]);
int * intptr= (int*) first;
*first=64;
printf("%s\n",unix); /* prints @ /*
答案 3 :(得分:0)
由于这被标记为C ++,而不是C,我还建议您阅读C样式转换的C ++样式转换:
static_cast<Derived *>(pBase)->DMethod();
if (dynamic_cast<Derived *>(pBase)) dynamic_cast<Derived *>(pBase)->DMethod();
const_cast<CRect &>(constRect).x = 3;
int *pInt = reinterpret_cast<int *>(charbuff);
我强烈推荐Scott Myer的书“Effective C ++,55改进你的程序和设计的具体方法”,第3版非常好地解释了这些。确保你获得第3版,尽管第2版也可能包含C ++样式。
基本上,如果您使用C ++并且您的编译器是在过去10年内编写的,那么绝对不要使用C风格的强制转换。使用C ++样式转换。