質問

私はこれを指定する本を読んだことがあります:

//: 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++ スタイルのキャストを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top