以下代码运行编译器选项-O3
vs -O0
结果不同的输出:
#include <stdlib.h>
#include <stdio.h>
int main(){
int *p = (int*)malloc(sizeof(int));
int *q = (int*)realloc(p, sizeof(int));
*p = 1;
*q = 2;
if (p == q)
printf("%d %d", *p, *q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我对结果感到非常惊讶.
用clang 3.4,3.5编译(http://goo.gl/sDLvrq)
使用编译器选项-O0
- 输出:2 2
使用编译器选项-O3
- 输出:1 2
这是一个错误吗?
有趣的是,如果我稍微修改代码(http://goo.gl/QwrozF),它的行为与预期一致.
int *p = (int*)malloc(sizeof(int));
*p = 1;
Run Code Online (Sandbox Code Playgroud)
在gcc上测试似乎工作正常.