实际上,规则6.8.6.1规定:
A goto statement is not allowed to jump past any declarations of objects
with variably modified types.
在您的代码中,不存在具有可变修改类型的对象. alloca不声明对象(编译器必须关注).因此,没有类似于alloca的范围,并且没有理由在规则6.8.6.1的意义上存在未定义的行为.
编辑
稍微详细说明答案:VLA情况下行为的“不确定性”是由于承诺声明对象在其范围内(在语言级别)“已知”.通常,声明为代码执行设置上下文.它不需要在运行时执行.但是,在VLA的情况下不是这样:这里的承诺部分在运行时实现,打破了C的静态声明方法.为了避免导致动态类型系统的进一步冲突,规则6.8.6.1避免了这种冲突.
相反,在语言层面,alloca只是一个函数;它的电话不构成任何范围.在调用它时,它只对其运行时行为做出承诺.如果它没有被调用,我们不会“期望”任何函数.因此,它的纯粹存在不会引起任何冲突:两种情况(绕过或不绕过)都有明确定义的语义.