使用未初始化的变量UB的地址?

时间:2016-10-07 13:31:19

标签: c printf undefined-behavior variadic-functions

这是小码UB吗?

void Test()
{
  int bar;
  printf("%p", &bar);  
}

IMO不是UB,但我还想要其他一些意见。

即使bar从未初始化,它也会打印bar的地址。

3 个答案:

答案 0 :(得分:7)

TL:DR 不,您的代码不会使用任何未初始化的来调用UB,正如您可能想到的那样。

(ny)变量的地址(在这种情况下是自动的)具有定义的值,因此无论变量本身是否被初始化,变量的地址都是< em>定义值。您可以使用该值。 (如果你没有处理指针并进行双重引用。:)

那说严格来说,你应该写

 printf("%p", (void *)&bar);

因为%p期望类型指针的参数voidprintf()是可变参数函数,所以不执行促销(转换)。否则,这是一个明确定义的行为。

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)

此行为已明确定义。

变量的地址是已知的。它没有被明确初始化的事实并不重要。