-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 回答