0

我需要获取程序中某些变量的内存地址。获取 short、int、uint32_t 等类型的 2 或 4 字节变量的地址没有问题。但是,当我尝试获取 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

有人可以指出我做错了什么吗?

4

1 回答 1

3

流输出会将某些类型视为遗留 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';
}

您会看到一个打印出整个字符串,而后者将其视为指针。

于 2019-12-09T01:36:47.593 回答