我试图更好地理解C中的块作用域,以及该标准是否提供了有关退出块作用域时弹出堆栈元素的任何保证,而这些保证可能在进入该作用域时已被推送到堆栈中。例如,在该块内声明了变量后,跳转到块外的标签(就是,跳转到C中的标签,那里没有什么特别的东西)是否会导致堆栈损坏?
这是一个人为的示例,如果有助于进一步定义问题,请假设-O0
。我的困惑是,err2
当跳转到fatal
标签的执行路径被击中时,是否从堆栈中弹出。因为标签在C中没有什么特别的,所以我假设它err2
不会从堆栈中弹出,并且会导致堆栈损坏。
void foo()
{
int err;
if (err = baz()) {
printf("error %i", err);
int err2;
if (err2 = another_thing())
goto fatal;
}
printf("done");
return;
fatal:
printf("there was a fatal error");
}
无法肯定地回答;但是,大多数编译器会一次为该函数分配所有内存。
实际上,如果超出范围,访问指向它的指针是一个坏主意,否则您将不在乎。即使在-O0
,范围外变量的内存也可能会被重用。
在任何情况下,局部变量都不会泄漏。堆栈不会变得不平衡。问题中的代码没有任何危险。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句