请教一个指针的问题

zephyrwz 2003-08-09 10:22:22
定义tempptr是一个指针,假定temptptr在内存里面的地址是50000,这个地址里面放的是一个指向某变量的地址60000,如果free(temptptr),那么释放的是60000这个值,还是50000这个值?如果释放的是50000的话,是不是以后在访问temptptr就好像没有定义过这个指针一样呢?
...全文
62 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenWong1981126 2003-08-13
  • 打赏
  • 举报
回复
题目是有点含糊,不过我觉得这个问题的根本在于考查:释放一个指针,到底是释放存储该指针所在的内存空间(换句话说就是删除该指针吧)?还是释放该指针指向的内存空间。

我觉得大多数人都会赞同后一种观点吧。

另外我想请教一下关于前面提出的一个问题,我做了个实验,用TC++3.0

#include<iostream.h>
#include<conio.h>
struct Node
{
char info;
Node *next;
};
void main()
{
Node a,b,c;
a.info='a';
a.next=&b;
b.info='b';
b.next=&c;
c.info='c';
c.next=NULL;


Node *first=&a,*current=&b;

first->next=current->next;

delete current;
current=first->next;

clrscr();
cout<<"first: "<<first->info<<endl<<"current: "<<current->info<<endl;
cout<<first<<current;
}
在delete current后的那个给current赋值的语句执行后会有这样一句结果"NULL pointer assignment"是编译器给出的警告吗?如何很好地解释这种现象呢?
zephyrwz 2003-08-12
  • 打赏
  • 举报
回复
越来越糊涂了-_-!
xiaomimiya 2003-08-12
  • 打赏
  • 举报
回复
指针是存放地址的,也占用一定的空间,所谓释放指针就是指存放这个指针的空间不再为这个指针服务了。这个空间就是自由的了就是说不存在这个tempptr指针了,需要从新申请指针。所以我认为是释放的是temptptr在内存里面的地址50000
dousp 2003-08-12
  • 打赏
  • 举报
回复
~o~
sharkhuang 2003-08-12
  • 打赏
  • 举报
回复
写错了!是把50000所指的置为NULL!不然50000指的内用是没有意义的(野指针了!)!而且应为!NULL还可能被用到!会引起严重后果!
sharkhuang 2003-08-12
  • 打赏
  • 举报
回复
释放的是60000了!所以要有好习惯再把50000置为NULL!
shaneylee 2003-08-12
  • 打赏
  • 举报
回复
当然是释放50000得内容。
因为指针本身也只是一个变量,只不过她存放了另一个变量的存放地址而已。
所以free(p)相当于释放一个变量,清空这个变量的内容。
如果free(*p)那就是释放p所指的空间了。
BinaryWorld 2003-08-12
  • 打赏
  • 举报
回复
#include <iostream.h>
#include <new.h>

void main(void)
{
int *p=NULL;
cout<<p<<endl;
p=new int;
cout<<p<<endl;
cout<<*p<<endl;

delete(p);
cout<<p<<endl;
cout<<*p<<endl;
}

/*
0x00000000
0x00431B50
-842150451
0x00431B50
-572662307
Press any key to continue
*/
释放了一个指针变量,无非告诉系统这块内存可以由系统分配使用。如果不释放的话,那么系统会认为有进程在使用该内存,而不修改不分配该内存。意味着浪费掉一些内存。而这些区域的值也是不可知的,或者没有变,或者改变,这时候指针变量如果不进行一次正确的赋值操作,就是野指针了,因为可能别的进程已经使用了该内存。除非使用标准库new.h。

阁下的问题本身很含糊啊,p的地址为50000,p的内容是地址60000,那么释放p就是释放50000的内容


小生说的对不对,还望各位大侠指教!
zhmid 2003-08-12
  • 打赏
  • 举报
回复
zephyr8202@hotmail.com

加我
zhmid 2003-08-12
  • 打赏
  • 举报
回复
西风狂诗曲
BenWong1981126 2003-08-12
  • 打赏
  • 举报
回复
删除的肯定是600000,不信自己可以动手试一下。
cgsw12345 2003-08-12
  • 打赏
  • 举报
回复
听楼上的!
luhongming 2003-08-12
  • 打赏
  • 举报
回复
当然是释放掉temptptr指向的内存单元。还有只能释放有new运算符开辟的单元,如果是普通的变量不能释放,会出错。如:
int a = 1;
int *p = &a;
delete p;
这样就出错了。但如果这样就行了:
int *p = new int;
delete p;
而且释放的是新开辟的单元,不是指针p本身,即60000这个单元。
如果是p被释放掉了,那么做了
  delete p;
以后就不能再用p了,即如果再
  p = new int;
就出错了,而事实一这样是可以的。
alan118 2003-08-11
  • 打赏
  • 举报
回复
如果是释放60000这个地址里面的内容的话,那么大家看一下:
比如说有一个链表

A->B->C
指向A的指针是first,指向B的指针是current

现在要删除B结点........

first->next=current->next;
delete current;
current=first->next;
这样对不对阿 ,有人说
“current=first->next;current已经释放,这里要出错。”
他的说法对不对呀
-----------------------------------------------------------
他说得不对,楼上的兄弟们都已经说清楚了,delete current;后,current所指的内存内容被删除,但是没有删除current,current是个指针,指针是什么?一个变量,类型应该是无符号长整型(unsigned long),它的值是个内存地址。delete后,current的值是不变的,但他的值所代表的内存释放。总之,在delete后,current的值还是存在的。
BenWong1981126 2003-08-11
  • 打赏
  • 举报
回复
我的理解是这样的,首先free(ptr)的功能是回收ptr指向的内存空间(当然大小是在分配的时候决定),在回收的时候,该内存空间里之前所存的东东就全部丢弃了。上述所提出的问题中 500000单元中存放了一个指针tempptr,该指针指向的内存空间中存放了一个指针值600000。所以free(tempptr)的时候就回收了tempptr指向的空间,600000就被丢弃了。
zephyrwz 2003-08-11
  • 打赏
  • 举报
回复
楼上的 ,麻烦你看一下上面他们说的,对于free(ptr),他们的意思是释放ptr这个地址里面的值,不是释放ptr这个地址。按照你说的,那么就是说释放的是ptr的地址 喽??
二者有点矛盾亚,能不能给个权威的答案呢 ,谢谢!
zephyrwz 2003-08-11
  • 打赏
  • 举报
回复
恩 ,看来现在分成两派了 到底是哪个呢?
caizzrr 2003-08-10
  • 打赏
  • 举报
回复
当然释放指针所指的空间啦,就是那个为60000地址的空间
021850524 2003-08-10
  • 打赏
  • 举报
回复
释放的是指针所指的60000处的内存单元,但释放后指针仍然还指向60000,此时就应该把指针悬空,即把指针置NULL.
alan118 2003-08-10
  • 打赏
  • 举报
回复
释放指针所指的内存,然后应该把指针置NULL
加载更多回复(15)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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