通过书籍,第一个cout行应该打印出存储 char变量b 的位置的地址,这似乎是 int变量a <的情况/ strong>也是。但第一个cout语句打印出一个奇怪的&#39; dh ^#&#39; ,而第二个语句正确打印十六进制值&#39; ox23fd68&#39; 即可。为什么会这样?
#include<iostream>
using namespace std;
int main()
{
char b='d';
int a=10;
char *c=new char[10];
c=&b;
int *e=&a;
cout<<"c: "<<c<<endl;
cout<<"e: "<<e;
}
答案 0 :(得分:5)
const char*
类型有一个非成员重载operator<<(std::basic_ostream),它不写地址,而是(假定的)C风格的字符串 1)。在您的情况下,由于您已分配单个字符的地址,因此没有NUL
终结符,因此没有有效的C样式字符串。代码展示undefined behavior。
int*
的行为是不同的,因为对int
的指针没有特殊处理,并且语句按预期将地址写入流。
如果您想获取角色的地址,请使用static_cast
:
std::cout << static_cast<void*>( c ) << std::endl;
<小时/> 1) C风格的字符串是一系列字符,以
NUL
字符('\0'
)结尾。
答案 1 :(得分:4)
实际上这个程序有问题。内存泄漏。
char *c=new char[10];
c=&b;
这会在堆上分配10个字符,但是使用变量b
的地址覆盖指向堆的指针。
当char*
用cout
写入operator<<
时,它被视为空终止的C字符串。当b的地址初始化为包含d
op<<
的单个字符时,继续在堆栈上搜索找到第一个空字符。它似乎是在几个字符之后找到的,因此dh^#
被写入(d
是变量b
的值,其余的只是在第一个之前在堆栈上找到的一些随机字符\0
char)。
如果您想获取地址,请尝试使用static_cast<void*>(c)
。
我的例子:
int main() {
char *c;
char b = 'd';
c = &b;
cout << c << ", " << static_cast<void*>(c) << endl;
}
输出:
dÌÿÿ, 0xffffcc07
在'd'之后看到奇怪的字符。
我希望这会有所帮助!