我有一个结构,我正在尝试打印其成员变量的地址。 当试图通过&(f.c)打印char成员变量的地址时,我没有得到他们的地址。
struct foo
{
char c;
short s;
void *p;
int i;
};
int main()
{
cout << "Size of foo: " << sizeof(foo) << endl;
foo f;
cout << "Address of c: " << reinterpret_cast<void*>(&f.c) << endl;
cout << "Address of c: " << &(f.c) << endl;
cout << "Address of s: " << reinterpret_cast<void*>(&f.s) << endl;
cout << "Address of s: " << &(f.s) << endl;
cout << "Address of p: " << reinterpret_cast<void*>(&f.p) << endl;
cout << "Address of p: " << &(f.p) << endl;
cout << "Address of i: " << reinterpret_cast<void*>(&f.i) << endl;
cout << "Address of i: " << &(f.i) << endl;
return 1;
}
/pp/cplus/bas ]$ ./a.out
Size of foo: 12
Address of c: 0xffbfe680
Address of c: //----------- &(f.c). Why this is empty..
Address of s: 0xffbfe682
Address of s: 0xffbfe682
Address of p: 0xffbfe684
Address of p: 0xffbfe684
Address of i: 0xffbfe688
Address of i: 0xffbfe688
当我尝试通过&amp;(f.c)
访问它时,我想知道它为什么不打印使用gcc版本3.4.6编译
答案 0 :(得分:9)
cout
对operator<<
有一个char*
重载,它将参数视为指向C字符串的指针,并尝试打印该C字符串中的所有字符,直到它获得到NUL(0)字节。要解决此问题,您必须将地址转换为void*
,就像您正在执行其他每一行一样。
您刚刚经历过数组有时被视为二类数据类型的原因,因为在某些情况下它们会得到特殊处理(即char
的数组被某些事物区别对待,而不是其他事物。
Address of c:
为空,因为这是您尝试打印&f.c
指向的字符串时获得的内容。正如dark_charlie指出的那样,使用未初始化的变量是未定义的行为,所以从技术上讲,任何事情都可能发生,但前者可能是你所看到的解释(虽然我们只能猜测)。
答案 1 :(得分:3)
原因是没有重新解释强制转换&amp;(f.c)是一个char *指针,它被cout视为一个字符串。因为你没有用任何东西填充char,你调用一个未定义的行为(即它可以打印任何东西)。