質問
私はこれを指定する本を読んだことがあります:
//: C03:SimpleCast.cpp
int main() {
int b = 200;
unsigned long a = (unsigned long int)b;
} ///:~
「キャスティングは強力ですが、頭痛の種になることがあります。 状況に応じて、コンパイラはデータをあたかも ( インスタンス)が実際よりも大きいため、より多くのスペースを占有します。 記憶;これにより、他のデータが踏みにじられる可能性があります。これは通常発生します ポインタをキャストするとき、 上の図を参照。
キャスト ポインターが他のデータを踏みにじる例を教えてください。
解決
int main(void)
{
short int a = 5;
short int b = 7;
*(long int*)&a = 0;
}
仮定します sizeof(long) > sizeof(short)
, 、およびコンパイラが置くと仮定します a
前のスタックに b
, b
破壊されます。
他のヒント
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;
}
char unix[5]="unix";
char* first= &(unix[0]);
int * intptr= (int*) first;
*first=64;
printf("%s\n",unix); /* prints @ /*
これは 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 Specific Ways to Improvement Your Programs and Designs, 3rd Edition』を強くお勧めします。これらのことを非常にわかりやすく説明しています。必ず第 3 版を入手してください。ただし、第 2 版でも C++ スタイルのキャストがカバーされている可能性があります。
基本的に、C++ を使用していて、コンパイラが過去 10 年以内に作成されたものである場合は、C スタイルのキャストを決して使用しないでください。C++ スタイルのキャストを使用します。
所属していません StackOverflow