Когда вы передаете адрес символа в ostream, он интерпретирует его как адрес первого символа строки "C-стиля" ASCIIZ и пытается напечатать предполагаемую строку.У вас нет NUL-терминатора, поэтому выходные данные будут пытаться читать из памяти, пока не произойдет его поиск, или ОС не отключит его для попытки чтения с недопустимого адреса.Весь мусор, который он просматривает, будет отправлен на ваш выход.
Вы, вероятно, можете заставить его отображать нужный вам адрес, приведя его, как в (void*)&b
.
Re смещения вструктура: вы заметили, что строка помещена со смещением 8. Вероятно, это связано с тем, что у вас есть 32-разрядные числа, затем 8-разрядный символ, а затем компилятор решает вставить еще 3 8-разрядных символа, чтобы строковый объект былвыровнен по границе 32-битного слова.Многим ЦП / архитектурам памяти нужны указатели, целые числа и т. Д., Чтобы они находились на границах размера слова, чтобы выполнять над ними эффективные операции, и в противном случае им пришлось бы выполнять гораздо больше операций для чтения и объединения нескольких значений из памяти, прежде чем они смогут использовать значенияв операции.В зависимости от вашей системы может потребоваться, чтобы каждый объект класса начинался с границы слова, или std::string
, в частности, начинается с size_t, указателя или другого типа, который требует такого выравнивания.