当我尝试获取结构成员的地址时,会发生奇怪的事情

strange thing happens when I try to get the address of a struct member

本文关键字:地址 获取 结构 成员      更新时间:2023-10-16

我尝试使用获取地址运算符"&"来获取结构类型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]