Почему я не могу получить адрес памяти переменных char или uint8_t в MSVS2019 / C++?
Мне нужно получить адрес памяти для некоторых переменных в моей программе. У меня нет проблем с получением адресов 2- или 4-байтовых переменных типа short, int, uint32_t и т. Д. Однако, когда я пытаюсь получить адрес 1-байтовой переменной, я получаю искаженный текст на консоли вместо числового адреса.
Вот код, с которым я работаю:
#include <iostream>
int main()
{
char test2[16] = { 'a','b','c','d','e','f' };
std::cout << "test2 memory address: " << &test2 << std::endl;
int a = 69;
uint8_t b = 69;
//int x = (int)&b;
char z = 0x33;
short z1 = 0x1551;
std::cout << "memory address: int a " << &a << std::endl;
std::cout << "memory address: uint8_t b " << &b << std::endl;
std::cout << "memory address: char z " << &z << std::endl;
std::cout << "memory address: short z1 " << &z1 << std::endl;
return 0;
}
Вывод в консоль:
test2 memory address: 0075FE28
memory address: int a 0075FE04
memory address: uint8_t b E╠╠╠╠╠╠╠╠E
memory address: char z 3╠╠╠╠╠╠╠╠√²u
memory address: short z1 0075FDD4
Используя встроенный "просмотр памяти" в режиме отладки, я могу видеть 1-байтовые переменные, и они должны иметь следующие адреса: b: 0075fdfb z: 0075fde3
Может ли кто-нибудь определить, что я делаю не так?
1 ответ
Потоковый вывод будет обрабатывать определенные типы как устаревшие строки C (например, char *
например) и поэтому предположим, что вы хотите напечатать строку за указателем.
Чтобы исправить это, просто превратите его в тип, который поток не будет рассматривать как устаревшую строку C, например:
#include <iostream>
char xyzzy[] = {'h', 'e', 'l', 'l', 'o', '\0'};
int main() {
std::cout << xyzzy << '\n';
std::cout << reinterpret_cast<void*>(xyzzy) << '\n';
}
Вы увидите, что первый выводит всю строку, а второй обрабатывает ее как указатель.