LinuxSir.cn,穿越时空的Linuxsir!

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

C++为什么不允许两个指针指向同一变量?

[复制链接]
 楼主| 发表于 2003-8-6 22:17:04 | 显示全部楼层
我明白楼上的意思。但是我用的gcc编译通过的。
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.         int ival=1024;
  6. //      int *pi=&ival;
  7.         int *pi2;
  8.         *pi2=ival;
  9. //      cout<<"int *pi=&ival:"<<pi<<endl;
  10. //      cout<<*pi<<endl;
  11.         cout<<"*pi2=ival:"<<pi2<<endl;
  12.         cout<<*pi2<<endl;
  13. }
复制代码

现在把pi去掉,可以编译通过并正常运行。
不相信的话,可以编译一下试试。我说的是真的。
 楼主| 发表于 2003-8-6 22:21:49 | 显示全部楼层
最初由 zywwzy 发表
服了你了。
指针是什么,我看老兄再翻翻书吧,这种程序不死就怪了。以后这种低级问题少来了。

我也知道这是一个很常识的问题:指针一定要初始化。我也是在给别人讲指针的问题时用这个举例的,而且用了“对比”,结果令人……

现在我真是很难办 :confused:
发表于 2003-8-7 09:43:02 | 显示全部楼层
没有给指针初始化,并不一定就会segment fault。只有指针访问到正文段或者其它程序的地址时,才会发生segment fault。看看这个极端一点的例子:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.         int *pi2;
  6.         for(int i=0; i<16; i++)
  7.                 *(pi2 + i) = i;
  8.         cout<<"pi2 "<<pi2<<endl;
  9.         cout<<"pi2+16 "<<pi2+16<<endl;
  10.         
  11.         cout<<*pi2<<endl;
  12. }
复制代码

没有给指针初始化,照样可以写入这么多数据,但此时已经发生溢出,程序的行为是不确定的。
发表于 2003-8-7 10:00:23 | 显示全部楼层
老兄,指针没有指向可用的内存,就是野指针,发生什么都不奇怪。当然有时指针指的地方是不被保护的也不会出错,但是在下一个访问内存的操作时,没准就会出乱子,到时想找错误就难了,我就吃过大亏,你还是安全第一吧!
发表于 2003-8-7 16:52:20 | 显示全部楼层
最初由 fingster 发表
我明白楼上的意思。但是我用的gcc编译通过的。

  1. #include <iostream>

  2. using namespace std;

  3. int main()
  4. {
  5.         int ival=1024;
  6. //      int *pi=&ival;
  7.         int *pi2;
  8.         *pi2=ival;
  9. //      cout<<"int *pi=&ival:"<<pi<<endl;
  10. //      cout<<*pi<<endl;
  11.         cout<<"*pi2=ival:"<<pi2<<endl;
  12.         cout<<*pi2<<endl;
  13. }
复制代码


现在把pi去掉,可以编译通过并正常运行。
不相信的话,可以编译一下试试。我说的是真的。

如果程序这么简单可能运气好不出错,在复杂一点的程序里有这种代码是死定了,而且都不知道怎么死的。程序员最经典的那句话“靠,昨天还好好的”估计就是这样了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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