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

Jab*_*cky 3 c printf variadic-functions undefined-behavior

这个小代码是UB吗?

void Test()
{
  int bar;
  printf("%p", &bar);  
}
Run Code Online (Sandbox Code Playgroud)

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

bar即使bar从未初始化,它也只是打印地址.

Sou*_*osh 7

TL:DR不,你的代码不会像你想象的那样使用任何未初始化的东西来调用UB .


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

那说严格来说,你应该写

 printf("%p", (void *)&bar);
Run Code Online (Sandbox Code Playgroud)

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

C11,章节§7.21.6.1

p参数应该是指针void.[......]

  • ...换句话说,它**会调用UB. (3认同)