Michael Walz Michael Walz - 2 months ago 6
C Question

Is using the address of an uninitialized variable UB?

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.

Answer

TL:DR No, your code does not invoke UB by using anything unini tialized, 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

p The argument shall be a pointer to void. [.....]