c - 在 C 中的块范围内声明变量后使用 goto
问题描述
我试图更好地理解 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
,可能会重用范围外变量的内存。
在任何情况下,局部变量都不会泄漏。堆栈不会变得不平衡。问题中的代码没有任何危险。
推荐阅读
- r - 为什么我的孩子 Rmd 中的 include_graphics 不起作用?
- apache-kafka - 只读最新的 kafka 消息
- excel - 以编程方式将 XLSX 样式从一个文件复制到另一个文件
- spring-boot - 如何传递查询变量
- python - 在 iot edge 模块中传递环境变量
- gatsby - 对非博客内容的 Netlify CMS 感到困惑
- flutter - 颤振 - 从列表中创建堆栈
- c# - Uncaught (in promise) TypeError: data.map is not a function (React using axios getting data from ASP.NET API)
- reactjs - 逗号运算符无序列的意外用户
- c# - win 10 无法访问安装文件夹中的数据库