-1

私の例は一般的に正しくないことに気づきました。しかし、それがどのように機能するかを知るのは興味深いことです。

/* C/C++ (gcc-4.3.4) */
#include <stdio.h>
int main() {

        /*volatile*/ int i = 5;
        int j = 500;

        int *p = &j;

        printf( "%d %x\n", *p, p );

        p++;

        printf( "%d %x\n", *p, p  ); // works correct with volatile (*p is 5)
        //printf( "%d %x\n", *p, &i  ); //  works correct without volatile

        return 0;
}

ある種の最適化ですか?

UPDT わかり ました、UB について理解しました。他には期待しません。

しかし、互いに隣接して配置された2つのint変数がある場合(アドレスを参照)、なぜこのコードが機能しないのですか?

4

3 に答える 3

5
p++;

コードには未定義の動作があります。ポインターがゴミの場所を指しています。逆参照すると、予期しない結果が発生します。

于 2012-07-17T15:55:11.880 に答える
0

両方の変数がメモリ内で隣接している必要はありません。これを行うには、配列を使用できます。

#define PRINT(p) (printf("%i %p\n", *(p), (void *)(p)))

int t[2];
int *a = &t[0];
int *b = &t[1];

*a = 5;
*b = 6;

int *p = a;
PRINT(p);

++p;
PRINT(p);
于 2012-07-17T17:07:19.100 に答える
0

あなたは何と呼んでいますcorerctか?変数がどのように格納されるかは保証されていないため、ANY結果は正しい

于 2012-07-17T15:55:49.100 に答える