为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?
Why am I unable to obtain memory address of char or uint8_t variables in 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
有人可以指出我做错了什么吗?
流输出会将某些类型视为旧版 C 字符串(例如char *
(,因此假设您要打印指针后面的字符串。
要解决此问题,只需将其转换为流不会将其视为旧版 C 字符串的类型,如下所示:
#include <iostream>
char xyzzy[] = {'h', 'e', 'l', 'l', 'o', ' '};
int main() {
std::cout << xyzzy << 'n';
std::cout << reinterpret_cast<void*>(xyzzy) << 'n';
}
您将看到第一个打印出整个字符串,而后者将其视为指针。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- 兼容的声明 __attribute__ ((节( ".abc.dfe" ))) 常量易失性 uint8 属性变量 = 0;- 符合MISRA标准
- 将无符号int(uint8,16,32)存储在变量中
- 如何将4个UINT8变量连接成一个UINT32变量?