2016-10-07 17 views
3

Этот небольшой код UB?Использует адрес неинициализированной переменной UB?

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

IMO это не UB, но я хотел бы получить некоторые другие мнения.

Он просто печатает адрес bar, даже если bar не был инициализирован.

+0

Как насчет 'printf ("% d ", bar);'? Я помню, что некоторые обсуждения различались между неопределенными и неопределенными ... –

+4

'printf ("% p ", &bar);' -> 'printf ("% p ", (void *) &bar);'. Это, вероятно, не имеет решающего значения для вашего вопроса, но C стандарт требует этого. – usr

+1

@EugeneSh. 'printf ("% d ", bar);' определенно UB, он будет печатать все, что находится в памяти, по адресу 'bar'. –

ответ

7

TL: DR Нет, ваш код не вызывает UB, используя что-нибудь неинициализированный, как вы могли бы подумать.


Адрес в (Нью-Йорк) переменной (автоматический, в данном случае) имеет определенное значение а, так независимо от того, инициализируется сама переменная или нет, адрес переменной является определено значение. Вы можете использовать это значение. (, если вы не имеет дела с указателями и делать двойное разыменование. :))

Тем не менее, строго говоря, вы должны написать

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

%p, как ожидает аргумент типа указателя на void и printf() является вариационной функцией, не продвижение по службе (конверсия). В противном случае это четкое поведение.

C11, глава §7.21.6.1

p Аргумент должен быть указателем на void. [.....]

+0

Но не 'void *' совместим с любым типом указателя? –

+0

@MichaelWalz как? –

+0

@MichaelWalz, любой указатель может быть * преобразован * в тип 'void *', но такое преобразование не происходит с переменными аргументами, такими как второй и последующие аргументы 'printf()'. –

2

Такое поведение хорошо определено.

Адрес переменной известен. Тот факт, что он не был явно инициализирован, не имеет значения.

4

Это небольшой код UB?

Да, это UB, так как спецификатор преобразования pтребует в void -указатель.

С другой стороны, ниже код не вызывает UB

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

как адрес bar хорошо определен был самостоятельно ли bar сам инициализирован.

 Смежные вопросы

  • Нет связанных вопросов^_^