这是小码UB吗?
void Test()
{
int bar;
printf("%p", &bar);
}
IMO不是UB,但我还想要其他一些意见。
即使bar
从未初始化,它也会打印bar
的地址。
答案 0 :(得分:7)
TL:DR 不,您的代码不会使用任何未初始化的来调用UB,正如您可能想到的那样。
(ny)变量的地址(在这种情况下是自动的)具有定义的值,因此无论变量本身是否被初始化,变量的地址都是< em>定义值。您可以使用该值。 (如果你没有处理指针并进行双重引用。:))
那说严格来说,你应该写
printf("%p", (void *)&bar);
因为%p
期望类型指针的参数void
和printf()
是可变参数函数,所以不执行促销(转换)。否则,这是一个明确定义的行为。
C11
,章节§7.21.6.1
p
参数应该是指向void
的指针。 [.....]
答案 1 :(得分:4)
这是小码UB吗?
是的,它是UB,因为转换说明符p
需要一个void
- 指针。
另一方面,下面的代码不会调用UB
void Test(void)
{
int bar;
printf("%p", (void*) &bar);
}
因为bar
的地址是独立定义的,bar
本身是否已初始化。
答案 2 :(得分:2)
此行为已明确定义。
变量的地址是已知的。它没有被明确初始化的事实并不重要。