LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 900|回复: 13

关于free的两个奇怪的现象

[复制链接]
发表于 2005-9-15 11:07:59 | 显示全部楼层 |阅读模式
1.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. //      int flag;
  6.         int a = 1;
  7.         int* ptr;
  8.         ptr = NULL;
  9.         ptr = & a;
  10.         free(ptr);
  11. }
复制代码

如果把int flag那句恢复,运行的错误为“free(): invalid pointer 0xbffff150!”;否则,错误为"seqment fault".


2.

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.        int* element;
  6.         element = NULL;
  7.         int a = 1;
  8.         element = &a;
  9.         free(element);
  10. }
复制代码

运行时会有invalid pointer的错误。


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void test();

  4. int main()
  5. {
  6.       test();
  7. }

  8. void test()
  9. {
  10.         int* element;
  11.         element = NULL;
  12.         int a = 1;
  13.         element = &a;
  14.         free(element);

  15. }
复制代码

运行时没有报告。
发表于 2005-9-15 11:21:13 | 显示全部楼层
错误是正常的吧
调用free干嘛?
回复 支持 反对

使用道具 举报

发表于 2005-9-15 11:22:45 | 显示全部楼层
free的参数只能是malloc,calloc, realloc的返回结果
看programming from ground up第9章a simple memory manager
回复 支持 反对

使用道具 举报

发表于 2005-9-15 11:44:43 | 显示全部楼层
看到一句话,“主要是内容,是不是原返回句柄并不重要”!
比如
int *a, *b;
a=(int *)mallco(sizeof(int));
b= a;
free(b);
也是对的。
回复 支持 反对

使用道具 举报

发表于 2005-9-15 12:12:45 | 显示全部楼层
Post by zhllg
free的参数只能是malloc,calloc, realloc的返回结果
看programming from ground up第9章a simple memory manager

以及空值 NULL。
回复 支持 反对

使用道具 举报

发表于 2005-9-15 12:25:29 | 显示全部楼层
有篇文章介绍给楼主(http://www.linuxsir.cn/bbs/showthread.php?t=50097) 如果楼主看完以后,再对照自己的程序的汇编码,还有什么不明白的,我们再讨论
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-15 14:14:18 | 显示全部楼层
Post by x11
错误是正常的吧
调用free干嘛?

也许是我没有把问题说明白。
出错是必然的,问题的出错的类型。比如第一个程序,只是加了一句无关紧要的int flag;声明,出错的种类就不同了!这个问题回帖的几位谁都没有提及。
回复 支持 反对

使用道具 举报

发表于 2005-9-15 14:36:19 | 显示全部楼层
Post by Illidan
比如第一个程序,只是加了一句无关紧要的int flag;声明,出错的种类就不同了!这个问题回帖的几位谁都没有提及。

我提及了哦,只是比较含蓄而已,
int flag;声明看似无关,其实,如果你明白了malloc/free的原理以后,就会明白事实上并非无关.int flag;表示了在栈里面的四字节空间.说到底,把我给你的链接文章看完后就会明白了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-15 15:01:01 | 显示全部楼层
Post by rickxbx
我提及了哦,只是比较含蓄而已,
int flag;声明看似无关,其实,如果你明白了malloc/free的原理以后,就会明白事实上并非无关.int flag;表示了在栈里面的四字节空间.说到底,把我给你的链接文章看完后就会明白了

你的回答是一个嵌套,#include了一个大大的header file,够我看的,hoho。
用stack可以少动脑筋;用heap要小心翼翼才行。
回复 支持 反对

使用道具 举报

发表于 2005-9-15 16:22:21 | 显示全部楼层
Post by rickxbx
有篇文章介绍给楼主(http://www.linuxsir.cn/bbs/showthread.php?t=50097) 如果楼主看完以后,再对照自己的程序的汇编码,还有什么不明白的,我们再讨论

好文
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表