Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC中的编译器标志(C)_C_Gcc_Gcc4_Gcc4.7 - Fatal编程技术网

GCC中的编译器标志(C)

GCC中的编译器标志(C),c,gcc,gcc4,gcc4.7,C,Gcc,Gcc4,Gcc4.7,我已经阅读了GCC文档和man。 如果我将代码编译为 (1) gcc-o测试 我在执行它时得到了一些结果。 如果我把它编译成 (2) gcc-O-O测试 当我运行它时,会得到不同的结果 在阅读GCC man时,我使用(而不是-O)该人所说的选项-O处于活动状态的所有选项进行编译。 我没有得到与选项(2)相同的结果。结果是句子(1)的结果。 什么(未记录)改变了生成程序的行为? 测试代码: #include <stdio.h> int var1 = 0; int var2 = 0;

我已经阅读了GCC文档和man。 如果我将代码编译为 (1) gcc-o测试 我在执行它时得到了一些结果。 如果我把它编译成 (2) gcc-O-O测试 当我运行它时,会得到不同的结果

在阅读GCC man时,我使用(而不是-O)该人所说的选项-O处于活动状态的所有选项进行编译。 我没有得到与选项(2)相同的结果。结果是句子(1)的结果。 什么(未记录)改变了生成程序的行为? 测试代码:

#include <stdio.h>

int var1 = 0;
int var2 = 0;

int main() {
    int *pntr = &var2;
    pntr--;
    (*pntr) = 99;
    printf("Var1=%d\n",var1);
    printf("Var2=%d\n",var2);
}
#包括
int var1=0;
int var2=0;
int main(){
int*pntr=&var2;
pntr--;
(*pntr)=99;
printf(“Var1=%d\n”,Var1);
printf(“Var2=%d\n”,Var2);
}
没有问题

#include <stdio.h>

union 
{
  struct
  {
    int var1;
    int var2;
  };
  int arr[2];
}u;

int main() {
    int *pntr = &u.arr[1];
    pntr--;
    (*pntr) = 99;
    printf("Var1=%d\n",u.var1);
    printf("Var2=%d\n",u.var2);
}
#包括
协会
{
结构
{
int-var1;
int-var2;
};
int-arr[2];
}u;
int main(){
int*pntr=&u.arr[1];
pntr--;
(*pntr)=99;
printf(“Var1=%d\n”,u.Var1);
printf(“Var2=%d\n”,u.Var2);
}

由于未定义的行为,您的程序无效-您读取的内存无效,无法执行这样的指针运算。不同的结果可能意味着您的程序调用未定义的行为。如果是这样,则两个结果都是正确的,而您的代码是错误的。有少量优化直接由
-O
而不是通过
-f
开关之一启用。对于编译器,不禁止将损坏的代码优化到更糟的程度。选项-O在VAR1之前在VAR2内存中分配。如果删除-O选项,内存分配首先是VAR1,然后是VAR2。发生的情况是,激活-O选项的优化器(根据gccman)都没有这样做