如果没有设置优化标志,此代码可以正常工作:
#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
有与循环相关的问题。为什么?
也许这是一个错误?
我正在使用最新的4.8.0,经过测试的x64,x86以及其他版本。所有相同的行为。
答案 0 :(得分:8)
你正在使用GNU语言扩展,所以让我们看一下GNU documentation:
每次都会销毁在语句表达式中,语句中创建的任何临时语句都会在该语句结束时被销毁。
var
,并且指向其第一个元素的指针(表达式返回的内容)不能安全地取消引用。
答案 1 :(得分:2)
var指向的值在堆栈上分配。但是,var的范围是它包含在其中的括号。设置指向var的指针会导致未定义的行为。如您所见,在大多数情况下,堆栈中的值在打印时没有改变。但是,这可能会随着不同的优化设置而改变。这不是一个错误。这只是未定义行为的本质。