Is this small code UB?
void Test()
{
  int bar;
  printf("%p", &bar);  
}
IMO it's not UB, but I'd like some other opinions.
It simply prints the address of bar, even if bar has never been initialized.
Is this small code UB?
void Test()
{
  int bar;
  printf("%p", &bar);  
}
IMO it's not UB, but I'd like some other opinions.
It simply prints the address of bar, even if bar has never been initialized.
 
    
     
    
    TL:DR No, your code does not invoke UB by using anything uninitialized, as you might have thought.
The address of a(ny) variable (automatic, in this case) has a defined value, so irrespective of whether the variable itself is initialized or not, the address of the variable is a defined value. You can make use of that value. ( if you're not dealing with pointers and doing double-dereference. :) )
That said, strictly speaking, you should write
 printf("%p", (void *)&bar);
as %p expects an argument of type pointer to void and printf() being a variadic function, no promotion (conversion) is performed. Otherwise, this is a well-defined behavior.
C11, chapter §7.21.6.1
pThe argument shall be a pointer tovoid. [.....]
 
    
     
    
    Is this small code UB?
Yes, it's UB because the conversion specifier p requires a void-pointer.
On the other hand the code below does not invoke UB
void Test(void)
{
  int bar;
  printf("%p", (void*) &bar);  
}
as the address of bar is well defined independently whether bar itself got initialised.
 
    
    This behavior is well defined.
The address of the variable is known. The fact that it hasn't been explicitly initialized doesn't matter.
