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

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

本文关键字:CHAR 有效 十六进制地址 获取 C++ 是否      更新时间:2023-10-16

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

我的代码:

#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*的过载.对于其他类型的 pointe,该转换由编译器隐式完成,char您需要自己显式地进行转换:

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

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

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

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