【发布时间】:2012-12-16 11:38:15
【问题描述】:
在第二个右大括号之后,b 只能通过 a 间接访问。
int main() {
int *a;
{
int b = 42;
a = &b;
}
printf("%d", *a); // UB?
return 0;
}
由于b 不再在范围内,这是 UB 吗?我知道从已经返回的函数中取消引用指向非静态局部变量的指针是 UB,但在这种情况下,一切都在同一个函数中。
这是 C++ 中的 UB,但我不确定 C。
【问题讨论】:
-
如果您在 printf 之前声明
int c = 255;,我预测您将得到 255 而不是 42。这应该表明int b的堆栈区域已被丢弃并重用。跨度> -
@ZanLynx with clang 3.2 无论是否启用优化,它仍然打印 42。
标签: c scope undefined-behavior