TL: DR Нет, ваш код не вызывает UB, используя что-нибудь неинициализированный, как вы могли бы подумать.
Адрес в (Нью-Йорк) переменной (автоматический, в данном случае) имеет определенное значение а, так независимо от того, инициализируется сама переменная или нет, адрес переменной является определено значение. Вы можете использовать это значение. (, если вы не имеет дела с указателями и делать двойное разыменование. :))
Тем не менее, строго говоря, вы должны написать
printf("%p", (void *)&bar);
%p
, как ожидает аргумент типа указателя на void
и printf()
является вариационной функцией, не продвижение по службе (конверсия). В противном случае это четкое поведение.
C11
, глава §7.21.6.1
p
Аргумент должен быть указателем на void
. [.....]
Как насчет 'printf ("% d ", bar);'? Я помню, что некоторые обсуждения различались между неопределенными и неопределенными ... –
'printf ("% p ", &bar);' -> 'printf ("% p ", (void *) &bar);'. Это, вероятно, не имеет решающего значения для вашего вопроса, но C стандарт требует этого. – usr
@EugeneSh. 'printf ("% d ", bar);' определенно UB, он будет печатать все, что находится в памяти, по адресу 'bar'. –