LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: Xiangbuilder

pointer to structure有关的输出问题。

[复制链接]
 楼主| 发表于 2003-10-23 12:58:20 | 显示全部楼层
但是这个地址不是进程的可以合法访问的地址
所以会产生内存保护异常
你所说的“这个地址”是不是指的char的地址?
如果是的话,为什么int, double有地址,而char没有。
发表于 2003-10-23 15:35:37 | 显示全部楼层
int*和double*之类的指针和char*不一样,cout的<<运算符是重载的,可以输出各种类型的值,对于一般的指针,cout输出指针的值(16进制),这个不涉及指针指向的地址的内容的存取,对于char*,cout输出字符串,这个就要存取指针指向的地址的内容了,所以就出现了问题。
比如:
int *a = (int *)18;
cout << "a=" << a << endl;
输出:
a=0x12
这里只涉及到变量a的存取,a的值是18,它并不存取地址18的内容,所以地址18虽然不是你的进程可以访问的,但是这里并没有出错。

这里还要注意(这两天我刚看了一下),对于输出char*,地址0和其它地址是不一样的,它是做了特殊处理的,如果输出其它地址(不是你进程内的地址),程序直接就会“Segmentation fault”,输出地址0,会设置cout的failbit,表示流错误,如果不清除错误状态,这个流就不能工作,可以用clear()清除错误状态:
char *s = 0;
cout << s << end;
cout.clear();
cout << "after clear\n";
这里的“after clear”就可以输出,你前面的程序如果调用一下cout.clear(),哪个“builder”也可以输出。
 楼主| 发表于 2003-10-23 16:54:39 | 显示全部楼层
谢谢libinary的细心论述,
stack对这个问题的理解好象和你不同,

http://www.linuxquestions.org/qu ... amp;threadid=106915

quote: ui is of type int and when you call cout<<ui<<endl; you are asking for the address of the integer pointer. Now since you have assigned the pointer to null it will display 00000 since that is the address you assigned to ui.

uc is of type char and when you call cout<<uc<<endl; you are asking for the value of the string, now we run into a problem... so we are actually asking for the value stored by the pointer which does not exist so we crash"

我想他认为当程序运行至cout<<ui<<endl; 时,需要访问ui的地址,因为我把NULL赋值给了int* ui, 所以将输出00000;

当程序运行至cout<<ui<<endl; 时,需要访问由指针来贮存的string的值,但实际上它是不存在的。

发表于 2003-10-23 17:24:24 | 显示全部楼层
“ui is of type int”
这个说法不正确,ui的类型是unsigned int *,是指针,不是int,你试一下 cout << *ui; 就会得到一个“Segmentation fault”。
这里主要是对指针的理解,指针本身也是一个变量,它也有自己的地址和存储区,这里的ui在栈里占有4个字节(32位机器),对它赋值为0,就是把ui的值,也就是这4个字节的存储区变成0,cout << ui;的时候只是输出ui的值,这和它指向的地址没有关系,根本不涉及到地址0的存取,使用*ui的时候就会取ui指向的地址的内容
发表于 2003-10-23 17:30:24 | 显示全部楼层
这里做一下实验对比一下就很清楚了,特别是哪个clear()
 楼主| 发表于 2003-10-23 19:20:50 | 显示全部楼层
谢谢你进一步解决了我的困惑, 你解决了我的一些现在的和以前的关于指针的困惑, 真有云雾顿开之感。

我想我应该把这些理解说给stack听, 我想他也需要对这个问题有一个正确的认识。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表