0

次のコードを実行した後の q の値は? m' はバイト 2 からメモリに格納され、メモリに問題はありません。

int m = 44;
int* p = &m;
int n = (*p)++;
int* q = p - 1;
++*q;

このコードを gcc で実行すると、コードは q が指すメモリを 1606417464 に初期化し、最後の行でそれを 1606417465 に変更します。このメモリ ブロックには値が割り当てられていないため、これは理にかなっています。

xtools を使用して Mac でこのコードを実行すると、q が指すメモリはゼロとして初期化され、++*q の後に 1 に変更されます。この動作が発生する理由は何ですか?

4

1 に答える 1

0

( のように)変更しようとすると、コードは未定義の動作を呼び出します。*q++*q

int m = 44; // Let's say &m is 1000.
int* p = &m; //  p is 1000 now.
int n = (*p)++; // assigns 45 to 'n'.
                // Now *p (which is 'm') becomes 45.
                // Note p is not modified here but only *p is modified.
int* q = p - 1; // q is 996 or 1004 (depending on which side stack grows)
                //  and assumes sizeof(int*) == 4
                // which may or may not a valid address and may not belong
                // to your program.
++*q; // Here you are essentially modifying some random memory.
于 2013-10-05T22:38:04.720 に答える