cout
имеет перегрузку operator<<
для char*
, которая обрабатывает аргумент как указатель на C-строку и пытается печатать все символы в этой C-строке до тех пор, пока не достигнет NUL (0)байт.Чтобы обойти это поведение, вам нужно привести адреса к void*
, как вы делаете каждую другую строку.
Вы только что обнаружили причину, по которой массивы иногда считаются типами данных второго класса, потому что они обрабатываютсяособенно в некоторых ситуациях (то есть массивы char
обрабатываются по-разному в некоторых вещах, но не в других).
Address of c:
пусто, потому что это то, что вы получаете, когда пытаетесь напечатать строку, на которую указывает &f.c
.Как указывал dark_charlie, использование неинициализированной переменной является неопределенным поведением, поэтому технически все может произойти, но первое, вероятно, является объяснением того, что вы видите (хотя мы можем только догадываться).