我尝试使用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返回一些值(可能接近)该内存地址。剂量与结构中的内存对齐有关吗?
答案 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]