根据优化级别的不同,输出的差异如下:
具有意外输出:

$ gcc -Wall -O3  otest.c -o otest
$ otest
*x: 0
y: 2048.899902
y: 0.000000

预期产量:
$ gcc -Wall -O2  otest.c -o otest
$ otest
*x: 45000e66
y: 0.000000
y: 2048.899902

源代码:
#include <stdio.h>
int main(void)
{
   float y = 2048.9;
   void *p = &y;
   unsigned int *x = p;
   printf(" *x: %x \n",*x);
   *x = 0;
   printf(" y: %f \n",y);
   *x = 0x45000e66;
   printf(" y: %f \n",y);
   return 0;
 }

gcc版本是4.2.1。
我有没有遗漏什么重要指示?

最佳答案

对。您的代码违反了严格的别名规则(当您有一个float时,但是您可以通过指向unsigned int的指针访问它,这是一个不兼容的类型),调用未定义的行为,因此编译器可以对您的代码做任何它喜欢做的事情,包括完全消除它的一部分。

关于c - gcc -O3,数据指针似乎丢失了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23391170/

10-11 21:20