LinuxSir.cn,穿越时空的Linuxsir!

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

大家试试这段代码

[复制链接]
发表于 2003-7-3 18:57:33 | 显示全部楼层 |阅读模式
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. char *getmemory(int n)
  5. {
  6.         char *m;
  7.         m=(char *) malloc(sizeof(char)*n);
  8.         strcpy(m,"i am in getmemory!");
  9.         printf("%s\n",m);
  10.         free(m);//[color=blue]请注意这里[/color]
  11.         strcpy(m,"i am still in getmemory!");
  12.         printf("%s\n",m);
  13.         return m;
  14. }
  15. int main()
  16. {
  17.         char *p=NULL;
  18.         p=getmemory(100);
  19.         printf("%s\n",p);
  20.         strcpy(p,"i am in main!");
  21.         printf("%s\n",p);
  22.         free(p);//[color=blue]请注释此句再试试![/color]
  23.         strcpy(p,"i am still in main");//[color=blue]也请注释此句试试![/color]
  24.         printf("%s\n",p);
  25.         return 1;
  26. }
复制代码
free好象有问题?
发表于 2003-7-3 19:18:31 | 显示全部楼层
运行结果如何???
游客  发表于 2003-7-3 19:35:10

正常啊

free()以后,内存的内容并不会马上消失,除非有程序利用了那块内存区域。
所以有那样的结果
发表于 2003-7-3 20:02:54 | 显示全部楼层
看看<高质量C++/C编程指南>是怎么说的。
http://www.fanyu.net/Security/data/jszl/jszl-8-1.htm

7.5 free和delete把指针怎么啦?
别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。

如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

  1. char *p = (char *) malloc(100);

  2.     strcpy(p, “hello”);

  3.     free(p);        // p 所指的内存被释放,但是p所指的地址仍然不变

  4.     …

  5.     if(p != NULL)   // 没有起到防错作用

  6.     {

  7.        strcpy(p, “world”);  // 出错

  8. }
复制代码
 楼主| 发表于 2003-7-3 20:10:50 | 显示全部楼层
问题是free后,再对p进行写操作strcpy,第一次成功,第二次提示Sagmentaton fault.如上面注释
发表于 2003-7-3 20:45:53 | 显示全部楼层
free()操作了两次,

第一次好像不起作用,

.......

p,m都是指针,free()在函数中不起作用了

在main()中才起了作用.......

why,everyone?????

发表于 2003-7-3 22:40:48 | 显示全部楼层
这个问题涉及到C语言的内存管理机制。free()函数调用后只是标志了所申请的内存块已经可以被别的申请所占用,而并不修改那段内存的值。因此,free后仍可以对那段内存进行读写操作,只是带有不确定性。
如以下的代码不会出错但存在隐患:

char *p = (char *)malloc(10);
free(p);
strcpy(p, "hello");
这种野指针产生的问题有时很难查出,最好是养成在free后把指针置为NULL的习惯。
至于free不把数据清零,我想这样做是出于效率上的考虑。就象硬盘上的文件,被删除时,只是在分区表上标明这部分扇区是空闲的,并不是真正的把这部分扇区的数据全部清零。那样做效率太低了。

对这个问题想深入了解的可以看看这个:
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=50097 
发表于 2003-7-3 23:02:16 | 显示全部楼层
Segment fault是什么产生的???


我试了在

p(指针) = NULL 的情况下会出现。。。。


发表于 2003-7-5 14:54:47 | 显示全部楼层
在Linux上,如果程序访问了操作系统认为不属于此程序的内存,就会产生Segment fault,并将程序终止。

如果是在win98上,同样的情况应该是产生一个并不确定的结果,有时是死机,比较倒霉的时候会reboot。
发表于 2003-7-6 11:10:17 | 显示全部楼层
free(p);//请注释此句再试试!

这个有错,同一内存不能free两次(m==p,therefor free(m) eq free(p)).
这是Segment fault产生的原因

不知道我说的是否正确?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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