社区
C语言
帖子详情
请教一个指针的问题
zephyrwz
2003-08-09 10:22:22
定义tempptr是一个指针,假定temptptr在内存里面的地址是50000,这个地址里面放的是一个指向某变量的地址60000,如果free(temptptr),那么释放的是60000这个值,还是50000这个值?如果释放的是50000的话,是不是以后在访问temptptr就好像没有定义过这个指针一样呢?
...全文
96
35
打赏
收藏
请教一个指针的问题
定义tempptr是一个指针,假定temptptr在内存里面的地址是50000,这个地址里面放的是一个指向某变量的地址60000,如果free(temptptr),那么释放的是60000这个值,还是50000这个值?如果释放的是50000的话,是不是以后在访问temptptr就好像没有定义过这个指针一样呢?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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)
BufferedOutputStream和BufferedInputStream
字节流缓冲区(.avi的复制) public class CopyMp3 { public static void main(String[] args) throws Exception { long start = System.currentTimeMillis(); copy(); long end = System.currentTimeMillis()
JAVA基础知识学习之part14——IO流2
1字节缓冲区流的概述和使用 2.字节流四种方式复制AVI并测试效率 3.转换流出现的原因 4.编码表的概述和常见的编码表 5.String类中的编码和解码
问题
6.转换流中的转码和解码
问题
7.OutputStreamWriter写数据的5种方式 8.InputStreamReader的数据的2种方式 选中文件后按F2(或者Fn,F2)可以重命名文件 9.字符流练习之复制JAVA文件 10字符流的练习之复制JAVA文件改进版 11字符缓冲区流的概述和使用
JAVA基础_IO流_字节流_抽象类OutStream&InputStream
文章目录1 File类1.1 File类的概述1.2 File类的构造方法1.3 File类的成员方法2 IO(字节流)2.1 IO流的概述2.1.1 什么是IO流,其作用是?2.1.2 IO流的分类2.1.3 字节流&字符流的抽象父类2.2 FileOutputStream写数据2.2.1 FileOutputStream写数据的三种方法2.2.2 FileOutputStream如何实现换行和追加写数据2.2.2.1 如何实现数据的换行2.2.2.2 如何实现数据的追加写入2.2.3 FileO
IO流的详细概述和应用案例(值得推荐)
IO流的详细概述和应用案例(值得推荐) 一、阐述IO流的概述和分类 IO流概述: 处理设备间数据传输
问题
IO流分类: 1、按流向(一定要站在Java程序这边看
问题
) –>输入流 –>输出流 2、按类型 –>字节流(图片,视频,音频,等多媒体文件) –>字符流(.txt结尾的文本文件) 图解: API总汇: 1、IO【字节流】抽象类和具体类的关系图:适合任意类型的文件读写...
JAVA——实现字节流四种方式复制AVI并测试效率
/* * 字节流四种方式复制AVI并测试效率 * 1 基本的字节流一次读写
一个
字节 : 耗时:231595 * 2 基本的字节流一次读写
一个
字节数组 : 耗时:320 * 3 高效的字节流一次读写
一个
字节 : 耗时:1363 * 4 高效的字节流一次读写
一个
字节数组 : 耗时:...
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章