为什么C++无法打印char的内存地址,但可以打印int或bool的内存地址?

12

可能是重复问题:
为什么字符数据的地址没有显示出来?

这里是代码和输出:

int main(int argc, char** argv) {

    bool a;
    bool b;

    cout<<"Address of a:"<<&a<<endl;
    cout<<"Address of b:"<<&b<<endl;

    int c;
    int d;

    cout<<"Address of c:"<<&c<<endl;
    cout<<"Address of d:"<<&d<<endl;

    char e;    
    cout<<"Address of e:"<<&e<<endl;

    return 0;
}

输出结果:

a的地址:0x28ac67

b的地址:0x28ac66

c的地址:0x28ac60

d的地址:0x28ac5c

e的地址:

我的问题是: 字符的内存地址在哪里?为什么没有打印出来?

谢谢。


好奇,你在用哪个编译器? - D.C.
你被C++的过度智能搞糊涂了。普通的C语言printf没有这个问题,因为它不会试图从参数类型推断正确的格式。 - dmckee --- ex-moderator kitten
3个回答

16

C/C++中的字符串可以用char*表示,这与&e的类型相同。因此编译器认为您要打印一个字符串。如果您想打印地址,可以将其转换为void*

std::cout << static_cast<void *>(&e) << std::endl;

11
我怀疑重载为char *版本的ostream::operator<<期望一个以NUL结尾的C字符串 - 而你只传递了一个字符的地址,所以这里存在未定义行为。你应该将地址强制转换为void *,以便打印出你期望的内容:
cout<<"Address of e:"<< static_cast<void *>(&e) <<endl;

@KorayTugay 这是一种类型转换,请使用谷歌。 (只是好奇:您知道static_cast<void *>的作用,但不知道(void *)的含义吗?) - user529758
不,我也不知道。你的看起来更容易一些,所以我决定问你。 - Koray Tugay
@KorayTugay 因为void *是一种通用指针类型。 - user529758
谢谢。所以这就像是说“任何类型的指针”?谢谢。明白了。 - Koray Tugay
@KorayTugay 说得对。比起C++,更适合用C语言(因为C++的类型更为严格,但在C中,void*可以指向任何 数据 指针类型——不过不能指向函数)。 - user529758
显示剩余7条评论

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接