. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->C/C++语言
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  一个指针的问题  [待解决] 回复[ 4次 ]   点击[ 745次 ]  
mywiil
[帖 主]   [ 发表时间:2008-11-08 18:15 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29
int* func() 

int* p = (int*)malloc(10); 
printf("%p\n",p); 
*p = 10; 
        free(p); 
        printf("%d\n\n",*p); 
return p; 



int _tmain(int argc, _TCHAR* argv[]) 

int* a = func(); 
printf("%p\n",a); 
*a = 20; 
printf("%p\n",a); 
printf("%d\n\n",*a); 

//free(a);//如果这里再次free 就会出现问题 
return 0; 


result: 
00371B0 
-17891602 

00371B0 
00371B0 
20 

问题:实际上func()中分配的内存已经在出func()的时候就释放了。当func()把已经释放的内存地址给指针a了, 然后*a再次被赋值,但是此时a指向的内存00371B0已经被释放了啊~~!!那么*a的值20是存在那里的? 
如果我再次free(a)就出错了,因为00371B0指向的内存已经释放了。 

请那位高人为小弟解释一下??
mywiil
[第1楼]   [ 回复时间:2008-11-08 18:32 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29
释放只是把内存的管理权交给系统了,跟里面的内容无关。
你free了,别的进程就能够使用你释放的空间了,数据就自然不定了吧。
insistforever
[第2楼]   [ 回复时间:2008-12-31 10:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-31 10:10
对于释放(free)的理解(个人想法,仅供参考):
你malloc后没释放时代表着你占用了这块内存(00371B0),别人不能再用它了。
你释放了代表别人可以使用这块内存了,但是你还是指向它的。
你再次free(a),a已经被func释放过了,你还要释放,当然出错了。
l441006922
[第3楼]   [ 回复时间:2009-01-05 15:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-25 15:59
free(a)


*a=null;试一试
djsxut
[第4楼]   [ 回复时间:2009-03-03 17:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-04-01 22:25
free(p);  
        假设指针p指向的地址为 011H,这里执行后,p本身的内容也即它里面的地址没变,只是指向那个地址处的内存被释放掉了,p 就成为了野指针,这时执行 printf("%d\n\n",*p); 可能得到 20,也可能出错。自然 fun函数返回的是 p 里的地址,也即 011H。
         那么在这个函数 _tmain(int argc, _TCHAR* argv[])  里,printf("%p\n",a); 这句代码自然也输出 011H, 不过 *a = 20; 这句话赋值时就错了,因为 011H 指向的内存早就被释放掉了,那那个 20(假如程序继续运行)自然也在那片内存里。但是这个时候程序就会篡改动态内存区(因为用 malloc 进行内存分配是在堆区分配)的内容,就可能会当掉,反正难以预料,很危险。对于第二次释放内存错误,是因为这块内存释放过一次了,那第二次释放什么呢?对于任何一片内存,释放两次肯定错。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved