GCC优化标志中断代码
gcc optimization flag break code
当没有设置优化标志时,此代码运行良好:
#include <cstdio>
int main(){
float *ptr = ({float var[10] = {1,2,3,4,5,6,7,8,9,10}; var;});
float *ptr1 = ({float var[10]; for(int i_=0;i_<10;i_++)var[i_]=i_+1; var;});
float *ptr2 = ({float var[10]; var[4]=5; var;});
printf("n value = %f %f %f",ptr[4],ptr1[4],ptr2[4]);
}
按预期返回5 5 5
。但是当设置了优化标志时,它返回5 0 5
。
ptr1
有问题的东西有关的循环。为什么?也许是个bug?
我使用的是最新的4.8.0,经过测试的x64、x86以及其他版本。
您正在使用GNU语言扩展,因此让我们查看GNU文档:
在语句表达式中,在语句内创建的任何临时都将在该语句结束时销毁。
var
每次都被销毁,并且指向其第一个元素的指针(即表达式返回的元素)对解引用是不安全的。
var所指向的值是在堆栈上分配的。然而,var的作用域是它所包含的括号。设置一个指向var的指针会导致未定义的行为。正如您所看到的,在大多数情况下,到您打印堆栈中的值时,它们并没有改变。但是,这可能会随着不同的优化设置而改变。这不是一个bug。这就是未定义行为的本质。
相关文章:
- 我的代码运行良好,但在游戏循环中中断
- 使用个人C++库编译代码时,与头文件一起使用时会中断
- 中断长代码 snprintf 格式和参数
- 为什么我的代码在第一个 if 语句处中断?
- 如何在不中断剩余代码的情况下仅C++中输入整数
- 移动返回对象的构造函数会中断C++98 代码?
- 为什么使用复制构造函数会导致此代码中断?
- VS2015 中的方法存在检查器代码中断
- 递归期间代码执行中断
- 添加<iostream>会中断 G++-7 中的代码
- 为什么Visual Studio Release生成在未执行的代码行中断
- 中断代码执行
- 如何中断本机扩展代码而不杀死解释器
- C++代码中断行,为了我的爱,我无法修复它
- F2C 转换的代码中断,当由编译器优化时C++
- 将布尔值转换为字符会产生错误和代码中断
- 尝试分配值时C++代码中断
- 如何从主机代码中断或取消 CUDA 内核
- Struct +函数代码中断
- 当我不输出变量时,代码中断;我什么时候工作。