转到VLA范围

时间:2017-02-21 04:11:54

标签: c

这是允许的吗?

goto inside;
{
inside:
int a[n];
}
  

goto语句不得跳出范围之外   具有可变修改类型的标识符在其范围内   标识符

倒数怎么样?

{
goto outside;
int a[n];
}
outside: ;

{
int a[n];
goto outside;
}
outside: ;

它们是一样的吗?

1 个答案:

答案 0 :(得分:3)

使用goto退出包含VLA的范围非常好。与使用returnbreak退出该范围没有什么不同。

使用goto进入带有VLA的作用域的问题是,VLA声明被视为包含一些调用alloca()以保留阵列堆栈空间的代码。如果您使用goto跳过声明,则您也跳过了alloca()调用,因此可能没有为数组保留任何空间。

请注意,除了alloca()之外,这与跳过变量初始化(例如int n = 1)并没有太大区别。 VLA就像总是有一个初始化器一样。