关于c ++:当我尝试获取struct成员的地址时会发生奇怪的事情

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

本问题已经有最佳答案,请猛点这里访问。

我尝试使用get address运算符"&;"来获取结构类型demo的某些成员变量的地址。
但如果成员类型为char,则会发生奇怪的事情。
我不知道发生了什么。有人能帮我解释为什么吗?这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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++编译了代码,得到了以下输出:

1
2
3
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就不会试图打印出实际字符。可以这样做:

1
cout <<"address of c:[" << (int*)((int)&s.c) <<"]"<< endl;

在这里,我们把地址转换成一个整数,然后返回到指针,这样当我们打印它时,它就在漂亮的POTEN-Y十六进制格式中。我编译了新代码并得到了以下结果:

1
2
3
address of a:[0x28fed4]
address of b:[0x28fed8]
address of c:[0x28fedc]