1

これはばかげた質問に違いありませんが、なぜこれが起こるのか理解できません

int main()
{
    int i=20;
    int *p=&i;
    cout<<"old p="<<p<<endl;
    *(++p) = 10;
    cout<<"p="<<p<<endl;

}

このコードでは、次のように出力されます: old p=0x22ff08 p=oxa

以前のアドレスをインクリメントしてその場所に 10 を割り当てるのではなく、ポインターの値が 10(0xa) に変更されるのはなぜですか?

4

3 に答える 3

4

以前のアドレスをインクリメントしてその場所に 10 を割り当てるのではなく、ポインターの値が 10(0xa) に変更されるのはなぜですか?

どの場所へ?そのような場所はありません。の配列ではなく、onepを指していました。このようなインクリメントの結果として生じるポインタは、間接化を実行できる場所を指していません。このコードのようにそうしようとすると、未定義の動作が発生します。つまり、絶対に何かが起こる可能性があります。何が起こる必要があるかについての要件がないため、コンパイラは好きなことを自由に行うことができます。やらないでください。 intint

特定の実験では、2 つの変数が隣り合って配置されているように見えます。インクリメントすると、変数p最終的にそれ自体を指し、10 が割り当てられます。これは 16 進数の A です。別のコンパイラ バージョンまたはコンパイラ オプションを使用してコンパイルした場合、またはコードに一見無害な変更を加えた場合でも、これが再び発生するという保証はありません。やらないでください。

于 2012-10-17T03:38:38.733 に答える
1

ポインターをインクリメントして、既に占有されているか、別のプログラム/プロセスによって使用されている可能性のある場所にアクセスしようとしており、その値を上書きしようとしています。

于 2012-10-17T03:39:28.247 に答える
1

ポインターを 1 要素ずつインクリメントすることで、実際には同じポインターにアクセスし、その値を 0xA に変更します。これらはメモリ上に順番に配置されているためです。

于 2012-10-17T03:44:12.690 に答える