c - GCC (C) 中的编译器标志
问题描述
我已阅读 GCC 文档和手册。如果我将代码编译为 (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);
}
推荐阅读
- javascript - 在 Jest 中模拟 execSync
- cytoscape.js - 如何将 Cytoscape 圆形节点分成几块
- python - 是否有类似于 matlab 的 python 语法来选择行和列?
- mongodb - 从聚合查询中的周整数获取isodate | 从 1 到 2019 年 12 月 30 日,从 2 到 2020 年 6 月 1 日
- ios - IOS:使用重复触发的通知仅在设备解锁时显示?
- angular - 如何从 Angular 8 在 AWS S3 中上传文件
- powerbi - DAX:同一张表上的嵌套总和
- firebase - 具有欧洲自定义域名的firebase功能
- c# - 这两个简单的 Async 和 Await 实现之间的输出差异
- .net - .NET Core 在 AzuerAD 身份验证后添加声明