char 型变量的地址为什么是乱码?

lei_zhuyan 2009-06-05 11:17:14
有个问题搞不明白,char型变量存在在哪个位置? 栈,还是自由存储区?


#include <iostream>
using namespace std;

int main()
{
char a = 'Z';
cout << "address of a: " << &a << endl; // 打印出来的是乱码

struct{
int a;
char b;
} xlyz;

xlyz.a = 1;
xlyz.b = 'Y';

cout << "xlyz.a address: " << &xlyz.a << endl;
cout << "xlyz.b address: " << &xlyz.b << endl;
cout << "xlyz.b value: " << xlyz.b << endl;

char* ptr = (char*)&xlyz.a;
ptr += 4;
*ptr = 'X';
cout << "xlyz.b value: " << xlyz.b << endl;
return 0;
}


=====================================
代码运行结果:
******************************
address of a: Zøâÿ¿tUB
xlyz.a address: 0xbfffe2c8
xlyz.b address: Yˆ
B`SZøâÿ¿tUB
xlyz.b value: Y
xlyz.b value: X
******************************

现在让人困惑的是:

如果结构体变量xlyz的成员的地址 打印出来是乱码的话,那么成员变量a的地址加4以后,就不可能是b的地址了.但是实际上ptr偏移4个字节后,竟然能够改变b的值.这应该可以说明b的地址应该是a的地址加4,也就是0xbfffe2cc了.但是为什么打印出来的是乱码?

各位了解的,能不能解释下?
先谢谢了.
...全文
577 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaaa3105563 2009-06-06
  • 打赏
  • 举报
回复
帮顶··
wanghao111 2009-06-06
  • 打赏
  • 举报
回复
需要使用void*进行转换
amossavez 2009-06-06
  • 打赏
  • 举报
回复
char*,在cout的重载重当做字符串来处理的,遇到\0就结束,所以要强制类型转换(void*)
中才德创 2009-06-06
  • 打赏
  • 举报
回复
int _tmain(int argc, _TCHAR* argv[])
{
char a = 'Z';
cout << "address of a: " << &a << endl;
}


cout << type是一个重载函数.
编译器会先诠释type是什么类型,以取舍哪个.
当它检视&a,发现char *.
接下来,它会怎么做呢?
会找最合适的那个重载函数.而cout << char*被找到了.
它的执行,意味着将指针指向地址的字符串输出(以NULL结尾).
"Z烫烫?":第一个字母还是Z,后面才开始异常,直到NULL才结束.
chinaboywuhan 2009-06-05
  • 打赏
  • 举报
回复
默认方式下,标准库的std::cout输出一个个字符,你要想取得地址,要么重载,要么强制转换。
goodname 2009-06-05
  • 打赏
  • 举报
回复
老邓 2009-06-05
  • 打赏
  • 举报
回复
其实要知道地址的话,为什么一定要输出呢?
调试时看变量所在内存地址是是基本的功能。
goodname 2009-06-05
  • 打赏
  • 举报
回复
cout重载了很多类型,对于char *,他就是当作以'\0'结尾的字符串来处理的.
老邓 2009-06-05
  • 打赏
  • 举报
回复
将地址强制转换成DWORD就可以输出了。
lei_zhuyan 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goodname 的回复:]
cout对于char *,将按照字符串来输出
你要想输出地址,可以使用

cout < < "address of a: " < < (void *)&a < < endl;
[/Quote]
试了试,如你所说.
--------------------------------------
lingyin55 2009-06-05
  • 打赏
  • 举报
回复
用cout输出一个指针的地址必须用强制转换,否则编译器不会认为你要输出一个地址。
不然你可以用printf("%p\n",&a);
lingyin55 2009-06-05
  • 打赏
  • 举报
回复
cout << "address of a: " << (void*)&a << endl; // 打印出来的是乱码
goodname 2009-06-05
  • 打赏
  • 举报
回复
goodname 2009-06-05
  • 打赏
  • 举报
回复 1
cout对于char *,将按照字符串来输出
你要想输出地址,可以使用

cout << "address of a: " << (void *)&a << endl;

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧