0

私はこれを指定する本を読みました:

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

「キャストは強力ですが、状況によっては、コンパイラがデータを実際よりも大きいかのように処理するように強制されるため、頭痛の種になる可能性があります。そのため、データはメモリ内でより多くのスペースを占有します。これにより、他のデータが踏みにじられる可能性があります。 。これは通常、上記のような単純なキャストを作成するときではなく、ポインタをキャストするときに発生します。」

では、キャストポインタが他のデータを踏みにじることができる例を教えてください。

4

4 に答える 4

5
int main(void)
{
    short int a = 5;
    short int b = 7;
    *(long int*)&a = 0;
}

を仮定し、コンパイラが前にスタックsizeof(long) > sizeof(short)を置くと仮定すると、は破棄されます。abb

于 2010-06-02T18:57:18.020 に答える
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;
}
于 2010-06-02T18:58:39.330 に答える
0
char unix[5]="unix";
char* first= &(unix[0]);
int * intptr= (int*) first;
*first=64;
printf("%s\n",unix); /* prints @ /*
于 2010-06-02T18:59:27.830 に答える
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);

ScottMyerの著書EffectiveC++、プログラムとデザインを改善するための55の特定の方法、第3版で、これらを非常によく説明していることを強くお勧めします。第2版​​もC++スタイルのキャストをカバーしている可能性がありますが、必ず第3版を入手してください。

基本的に、C ++を使用していて、コンパイラが過去10年以内に作成された場合は、Cスタイルのキャストを使用しないでください。C++スタイルのキャストを使用します。

于 2010-06-03T01:33:01.403 に答える