当我尝试获取结构成员的地址时,会发生奇怪的事情
strange thing happens when I try to get the address of a struct member
我尝试使用获取地址运算符"&"来获取结构类型demo.
的一些成员变量的地址但是,如果成员类型是字符,则会发生奇怪的事情。
我不知道发生了什么。谁能帮助我并解释为什么?这是我的代码:
#include <iostream>
using namespace std;
struct demo{
int a;
float b;
char c;
char d;
char e;
};
int main(){
demo s;
s.a = 0;
s.b = 0.1;
s.c = 'c';
s.d = 'd';
s.e = 'e';
cout << "address of a:[" <<&s.a <<"]"<< endl;
cout << "address of b:[" <<&s.b <<"]"<< endl;
cout << "address of c:[" <<&s.c <<"]"<< endl;
}
我用 g++ 编译了代码并得到了以下输出:
address of a:[0x7fff96b9f5c0]
address of b:[0x7fff96b9f5c4]
address of c:[cde]
s.a 和 s.b 的地址已正确打印。但是为什么s.c的地址是[cde]?似乎当类型为 char 时,&s.c 返回一些值(可能接近)该内存地址。它与结构中的记忆对齐有关吗?
这就是关于字符的事情,它试图打印位于s.c
位置的字符。这就是为什么它打印出"cde",因为s.c
后面的直接字符是"d"和"e",然后很可能是终止的 0。
您仍然可以使用 &s.c
获取地址并将其提供给指针。指针的值将是 float b
之后的几个字节的任何地址。
要解决此问题,您可以将地址&s.c
转换为另一种数据类型,例如 int
。
这样cout
就不会尝试打印出实际字符。
这可以像这样完成:
cout << "address of c:[" << (int*)((int)&s.c) << "]"<< endl;
在这里,我们将地址转换为整数,然后返回指针,以便在我们打印它时采用漂亮的指针-y 十六进制格式。
我编译了新代码并得到了以下结果:
address of a:[0x28fed4]
address of b:[0x28fed8]
address of c:[0x28fedc]
相关文章:
- 如何在C++中获取该对象的类声明中对象的地址?
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 如何获取C++字符数据类型的地址
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- 如何根据指针地址获取指针内容
- 从对象及其成员的地址获取指向成员的指针
- 如何从地址获取字符串?
- 从内存地址获取值
- PIN从指令地址获取程序集操作码
- 使用数组的地址获取过期指针
- 从调用堆栈地址获取函数参数
- 从IP地址获取完整的计算机名称,例如 abc.xyz.xvvx.net
- 如何通过地址获取元组中元素的索引
- 从成员的地址获取成员的索引
- 从IPv4地址获取网络接口名称
- 如何通过符号在内存中的地址获取有关符号的更多信息
- 正在WinDbg中按地址获取类型