| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 666 人关注过本帖
标题:指针问题。输出结果为什么都是一样?
只看楼主 加入收藏
明次
Rank: 5Rank: 5
来 自:China
等 级:职业侠客
帖 子:166
专家分:303
注 册:2009-1-11
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:2 
指针问题。输出结果为什么都是一样?
程序代码:
#include <iostream>
using namespace std;
int main()
{
  int *p1=new int;
  cout<<p1<<endl;
  delete p1;
  long *p2=new long;  //其实这里指向的是int的空间
  cout<<p2<<endl;
  cout<<p1<<endl;
  *p2=3;
  cout<<*p1<<endl;  //输出3
  cout<<*p2<<endl;  //输出3
  delete p2;
}
运行一看,前面3个输出结果一样。后面2两个输出结果也一样,为什么输出结果一样呀?该怎么解决?
搜索更多相关主题的帖子: 指针 结果 输出 
2009-09-06 14:20
xlh5225
Rank: 2
等 级:论坛游民
威 望:2
帖 子:188
专家分:25
注 册:2007-8-14
收藏
得分:25 
首先说明,输出结果一样,只是一个偶然的结果!
new 一个int 也就是p1是,他指向内存里的某一个地址.当delete p1后,实际的物理内存已经被释放了.但p1的值仍指刚才new的内存地址,但已经没有任何的意义(实际上,你应该将它设为0),当new p2时,p2是系统在堆上寻找一个符合long大小的空闲空间,然后动态分配给long,此时,p2指向某个内存地址,在你的例子中,p1,p2一样只是偶然!
对*p2赋值后,*p2等于3这是很自然的事情.由于偶然p1,p2指向了相同的内存地址,所以你打印*p1,也就是将本来是long的内容转化为一个int,所以相等的情况也就出现了.
顺便说一下,在delete后,你应该将p1设为0,而已像这种情况,你不应该在来用*p1,这是错误的,很可能会导致程序crash掉!
2009-09-06 16:06
kqscy1
Rank: 2
等 级:论坛游民
帖 子:17
专家分:81
注 册:2009-9-3
收藏
得分:25 
楼上说的对,但是p1和p2指向的内存地址一样不是偶然,应该是你建立的变量数据存储类型都是auto(自动分配),程序运行后,系统将为程序开辟一块称栈的活动储存区,栈按照“后进先出”的方式使用内存空间。你先是定义了第一个变量,使用了栈中的内存,在你释放后,再定义另外一个同类型变量,依然会使用以前使用的那个内存,因为栈的内存使用方式是固定的。
2009-09-07 13:49
快速回复:指针问题。输出结果为什么都是一样?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016197 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved