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

时间:2013-11-16 04:08:50

标签: c++ struct

我尝试使用get-address运算符“&”获取struct type demo的一些成员变量的地址 但是如果成员类型是char,则会发生奇怪的事情。我不知道发生了什么事。任何人都可以帮助我解释原因吗?这是我的代码:

#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时,&amp; s.c返回一些值(可能接近)该内存地址。剂量与结构中的内存对齐有关吗?

1 个答案:

答案 0 :(得分:1)

这是关于角色的事情,它试图打印位于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]