- 论坛徽章:
- 3
|
本帖最后由 captivated 于 2012-08-19 10:27 编辑
回复 11# OwnWaterloo
发个volatile的.- #include <stdio.h>
- int main(int argc, char *argv[])
- {
- int b = 30;
- int a = 20;
- int *p = &a;
- int **p2 = &p;
- *(*p2 + 1) = 100;
- //printf("&b = %p, *p2 + 1 = %p\n", &b, *p2 + 1);
- printf("b = %d, *(*p2 + 1) = %d\n", b, *(*p2 + 1));
- return 0;
- }
复制代码 编译: gcc -O3 volatile.c
输出:
b = 30, *(*p2 + 1) = 100
这个输出是有问题的, 从对栈的猜测来讲, b定义在a之上一般不会错, 因此 *(*p2 + 1) = 100;也就把b的值给修改了, 输出b应该是100.
编译器正常的情况下, 把变量b定义改成这样不管加多少级优化都应该没问题才对.
我测试过某个版本的gcc编译器. 用volatile也没效果. 去掉上面注释掉的那行代码, (不管多少级优化)你会发现地址输出一样一样的, 而且输出结果是b被改成100了.
这TMD简直就是“薛定谔的猫”了,哈哈.
|
|