1

当没有设置优化标志时,此代码可以正常工作:

#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 以及其他版本。所有相同的行为。

4

2 回答 2

8

您正在使用 GNU 语言扩展,所以让我们看一下GNU 文档

在语句表达式中,在语句中创建的任何临时对象都会在该语句结束时被销毁。

var每次都被销毁,并且指向其第一个元素的指针(这是表达式返回的内容)不安全地取消引用。

于 2013-05-15T03:32:32.303 回答
2

var 指向的值在栈上分配。但是,var 的作用域是它包含在其中的括号。设置指向 var 的指针会导致未定义的行为。如您所见,在大多数情况下,堆栈中的值在您打印它们时并没有改变。但是,这可能会随着不同的优化设置而改变。这不是错误。这只是未定义行为的本质。

于 2013-05-15T03:36:02.270 回答