我已经阅读了 GCC 文档和 man。 如果我将代码编译为 (1)gcc -o test test.c 执行时我得到一些结果。 如果我将其编译为 (2)gcc -O -o test test.c 当我运行它时,我得到不同的结果。
阅读 GCC 手册后,我使用(而不是 -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);
}
最佳答案
没有 UB 没有问题
#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);
}
关于GCC 中的编译器标志 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52617483/