我想知道程序在运行时在内存方面做了什么,因为它遇到了以下情况:
char chr = 'a';
char chrS[] = "a";
cout << "Address: " << &chr << endl;
cout << "Address: " << &chrS << endl;
这会产生以下结果:
Address: a�c�3�
Address: 0x7fff33936280
为什么我不能得到“chr”的内存地址?
我想知道程序在运行时在内存方面做了什么,因为它遇到了以下情况:
char chr = 'a';
char chrS[] = "a";
cout << "Address: " << &chr << endl;
cout << "Address: " << &chrS << endl;
这会产生以下结果:
Address: a�c�3�
Address: 0x7fff33936280
为什么我不能得到“chr”的内存地址?
因为&chr
产生一个char*
(const
这里的隐式添加)并cout
假设它是一个字符串,因此以 null 结尾,但事实并非如此。
但是,&chrS
产生 a char(*)[]
,它不会衰减到 a const char*
,因此将通过operator<<(std::ostream&, const void*)
打印地址的重载输出。
如果您想要这种行为,const char*
则必须执行显式强制转换。C 字符串和指向单个字符的指针之间没有区别这一事实是 C 字符串的主要缺陷之一。
尝试
cout << "Address: " << hex << (long)(&chr) << endl;
否则,当它获得指向 char 的指针时,它认为您正在给它一个字符串并尝试将其打印为一个字符串。