繁体   English   中英

是否可以在 C++ 中获得 CHAR 的有效十六进制地址?

[英]Is it possible to get the valid hex address of CHAR in C++?

我正在尝试获取 CHAR A4b5的有效内存地址,但是当我尝试使用十六进制编辑器访问该地址时,它没有读取我在编译后已在控制台输出中获得的地址。 十六进制编辑器正在验证地址为无效地址。

我的代码:

    #include <iostream>
using namespace std;
main ()
{
{   //INT
    cout << "INT" << '\n';
    int a = 2, b = 3;
    cout << "Result: " << "for " << "int a " << "= " << a << '\n';
    cout << "Result: " << "for " << "int a " << "= " << a << " " << "at " << "address " << &a << '\n';
    cout << "Result: " << "for " << "int b " << "= " << b << '\n';
    cout << "Result: " << "for " << "int b " << "= " << b << " " << "at " << "address " << &b << '\n';
    cout << "-----------------------------------------" << '\n';
}
{
    //SHORT
    cout << "SHORT" << '\n';
    short a = 2, b = 3;
    cout << "Result: " << "for " << "short a " << "= " << a << '\n';
    cout << "Result: " << "for " << "short a " << "= " << a << " " << "at " << "address " << &a << '\n';
    cout << "Result: " << "for " << "short b " << "= " << b << '\n';
    cout << "Result: " << "for " << "short b " << "= " << b << " " << "at " << "address " << &b << '\n';
    cout << "-----------------------------------------" << '\n';
}
{
    //FLOAT
    cout << "FLOAT" << '\n';
    float a = 2, b = 3.1;
    cout << "Result: " << "for " << "float a " << "= " << a << '\n';
    cout << "Result: " << "for " << "float a " << "= " << a << " " << "at " << "address " << &a << '\n';
    cout << "Result: " << "for " << "float b " << "= " << b << '\n';
    cout << "Result: " << "for " << "float b " << "= " << b << " " << "at " << "address " << &b << '\n';
    cout << "-----------------------------------------" << '\n';
}
{
//DOUBLE
    cout << "DOUBLE" << '\n';
    double a = 20, b = 30.1;
    cout << "Result: " << "for " << "double a " << "= " << a << '\n';
    cout << "Result: " << "for " << "double a " << "= " << a << " " << "at " << "address " << &a << '\n';
    cout << "Result: " << "for " << "double b " << "= " << b << '\n';
    cout << "Result: " << "for " << "double b " << "= " << b << " " << "at " << "address " << &b << '\n';
    cout << "-----------------------------------------" << '\n';
}
{
//CHAR
    cout << "CHAR" << '\n';
    char A4 = 'A' , b5 = 'B' ;
    cout << "Result: " << "for " << "Char A4 " << "= " << A4 << '\n';
    cout << "Result: " << "for " << "Char A4 " << "= " << A4 << " " << "at " << "address " << &A4 << '\n';
    cout << "Result: " << "for " << "Char b5 " << "= " << b5 << '\n';
    cout << "Result: " << "for " << "Char b5 " << "= " << b5 << " " << "at " << "address " << &b5 << '\n';
    cout << "-----------------------------------------" << '\n';
}
}

查看operator<<流的重载列表。 char const*那个假设在那个地址有一个以零结尾的字符串。 你想要的是void const*的重载。 对于其他类型的指针,该转换由编译器隐式完成,对于char您需要自己明确地进行转换:

cout << static_cast<void const*>(&b5) << endl;
char A4 = 'A';
cout << &A4;

正在打印char* ,当您打印char* ,标准库会尝试打印以空字符结尾的字符串。 由于您只有一个字符,因此没有空终止符,因此在标准库碰巧找到空字节之前会打印垃圾,这是未定义的行为。

要打印指针而不是字符串,您需要转换为不同的指针类型,例如:

char A4 = 'A';
cout << static_cast<void*>(&A4);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM