我意识到我的例子一般不正确。但有趣的是找出它是如何工作的。
/* 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。我不希望其他人。
但是如果我有两个相互相邻的int变量(见地址)为什么这个代码不起作用?
答案 0 :(得分:5)
p++;
代码具有未定义的行为。指针指向一些垃圾位置。取消引用它会导致不可预测的结果。
答案 1 :(得分:0)
你怎么称呼corerct
?
不保证变量将如何存储,因此ANY
结果是正确的
答案 2 :(得分: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);