注册 登录
编程论坛 C++教室

有实力的来瞧瞧吧

上善若飞 发布于 2010-11-28 16:29, 506 次点击
请高手看一下,我在用红色那一行的时候,最后的紫色两行输出是不相等的
当我用蓝色那一行的时候,最后两行输出是相等的,也就出错的,我知道这肯定的数据类型的原因,但是至今没有在书上找到这一方面的说法,请详细指点,拜谢!

#include<iostream>
using namespace std;
void main()
{

   int *p=new int;
   cout<<"未赋值前的p的地址:\t"<<p<<endl;
   cout<<"未赋值前的*p:\t\t"<<*p<<endl;
   *p=3;
   cout<<"赋值后的p的地址:\t"<<p<<endl;
   cout<<"赋值后的*p:\t\t"<<*p<<endl;
   delete p;
  cout<<"释放后的p的地址:\t"<<p<<endl;
   cout<<"释放后的*p:\t\t"<<*p<<endl;
   double *p1=new double;
   //long *p1=new long;
   cout<<"创建p1后的p的地址:\t"<<p<<endl;
   cout<<"创建p1后的*p:\t\t"<<*p<<endl;
  cout<<"创建p1后的p1的地址:\t"<<p1<<endl;
   cout<<"创建p1后的*p:\t\t"<<*p1<<endl;
   *p1=999;
   cout<<"p1后的p的地址:\t\t"<<p<<endl;
   cout<<"p1后的*p:\t\t"<<*p<<endl;
  cout<<"p1后的p1的地址:\t\t"<<p1<<endl;
   cout<<"p1后的*p:\t\t"<<*p1<<endl;
   *p=23;
   cout<<"赋值后的p的地址:\t"<<p<<endl;
   cout<<"赋值后的*p:\t\t"<<*p<<endl;
   cout<<"赋值后的p1的地址:\t"<<p1<<endl;
   cout<<"赋值后的*p1:\t\t"<<*p1<<endl;
   delete p1;


}
4 回复
#2
m21wo2010-11-28 17:58
只有本站会员才能查看附件,请 登录

p 没内存,你前面已经释放了它的内存
改法:
     去的 前面的 delete p;
后者
   换个变量 申请内存赋值为23
#3
上善若飞2010-11-28 19:58
回复 2楼 m21wo
我不是问你哪错了,我知道哪错了,我要问的是为什么申明不同的数据类型 long 和double 就得出不一样的结果
#4
zgxyz20082010-11-28 20:03
没看懂楼主想问什么~不过可以解释下你的程序:
当你delete p之后,系统会释放掉p所指向的内存,但是p仍然指向这个地址空间,这时p就是所谓的野指针,释放掉的这段内存可以被其他代码用了。当你用new double(或new long)的时候,编译器便申请了新的内存给p1(这个内存具体是那段,就看编译器了,我们可理解为随机的一段),不过当你new long的时候,哈哈~编译器恰好把p指向的地址空间分配给了p1,所以你以后给*p,*p1赋值,结果会一样(指向同一个地址空间)。不信的话,你在new long代码之前,加上一段代码(必须含new 分配(堆上分配)如: int *x=new int ; *x=5;),他们就不一样了。
#5
上善若飞2010-11-28 22:20
回复 4楼 zgxyz2008
感谢这位朋友,可能是我表达能力不够好,还是谢谢你
1