hrnt прав насчет причины пробела: &b
имеет тип char*
и поэтому печатается как строка до первого нулевого байта. Предположительно b
равно 0. Если вы установите b
на, скажем, «A», тогда вы должны ожидать, что распечатка будет строкой, начинающейся с «A» и продолжающейся с мусором до следующего нулевого байта. Используйте static_cast<void*>(&b)
для печати в качестве адреса.
Для вашего второго вопроса &c - &i
равно 8, поскольку размер int равен 4, символ равен 1, а строка начинается с следующая 8-байтная граница (вы, вероятно, на 64-битной системе). Каждый тип имеет определенное выравнивание, а C ++ выравнивает поля в структуре в соответствии с ним, соответственно добавляя дополнение. (Правило большого пальца состоит в том, что примитивное поле размера N выровнено с кратным N.) В частности, после b
вы можете добавить еще 3 поля char
, не затрагивая адрес &c
.