社区
C语言
帖子详情
请教一个指针的问题
zephyrwz
2003-08-09 10:22:22
定义tempptr是一个指针,假定temptptr在内存里面的地址是50000,这个地址里面放的是一个指向某变量的地址60000,如果free(temptptr),那么释放的是60000这个值,还是50000这个值?如果释放的是50000的话,是不是以后在访问temptptr就好像没有定义过这个指针一样呢?
...全文
62
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)
2小时精通C++智能
指针
智能
指针
可以解决普通
指针
存在的悬垂
指针
、野
指针
、资源泄露等
问题
本教程的主要的演示平台为Qt 4.11和g++ 7.4。学员也可以使用Visual Studio 2017。 教程中从最简单的例子入手,覆盖智能
指针
的常用技术点,并穿插...
请教
一个
c的
指针
重复获取随机数的
问题
我希望能做1-10的加法 可以指定做的次数 第一次做时获取随机数没有
问题
但是第二次以后每次我
指针
指向的单元 获取的随机数始终都是第一次的 求助怎么修改 能让我每一次做的加法运算是随机给出的数字而不是每次都一样...
c语言结构体
指针
菜鸟教,菜鸟
请教
C语言结构体
指针
实例化的
问题
?
该楼层疑似违规已被系统折叠隐藏此楼查看此楼在函数中对结构体赋值时赋不上,用printf查看结果始终为0,有人说是因为结构体
指针
使用前没有进行实例化导致。一知半解没明白什么叫实例化,好像是要用malloc分配内存。...
C语言|
指针
进阶(2):常量
指针
和
指针
常量、数组参数和
指针
参数、函数
指针
指针
是我们学习C语言的重工具,这篇博客是我对C语言
指针
进阶探索的又一深入,主要讲了
指针
常量和常量
指针
、数组参数和参数数组、...刚开始学习
指针
不久,写的不好,向各位大佬
请教
,欢迎大家给我提任何
问题
.........
C语言两个
指针
指向同
一个
,如何避免两个指向同
一个
地址的多次释放有关
问题
...
怎么避免两个指向同
一个
地址的多次释放
问题
本帖最后由 wallwind 于 2014-03-05 20:44:48 编辑比如以下代码#include#includeintmain(){int*ptr=malloc(10*sizeof(int));int*ptr2=ptr;if(ptr){free(ptr);ptr=NULL;...
C语言
69,381
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章