QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1416|回复: 5

为什么free()函数会出错???

[复制链接]
发表于 2004-5-13 22:41:20 | 显示全部楼层 |阅读模式
为什么一个指针例如 char*list[2], 如果没有令 list[0] = list[1] = NULL, 直接就free()时会出现段错误?(使用GCC编译)
好像在list[0]与list[1]的初始值相等时一定会出现.这时free(list[0])可以,但是再free(list[1])就出错.
但是如果令list[0] = list[1] = NULL,那么free(list[0]); free(list[0]);就不会出错,而且free(list[0]); free(list[1]);也不出错????
发表于 2004-5-13 23:28:54 | 显示全部楼层
我也不会      我帮你到频道问了大家
<Optical> 现在不一定都要自己去 free 吧
<quanliking> 小楼, 估计作了优化
<Optical> kernel 会干这类事情吧
<x11> 因为多次free NULL没事
<quanliking> 相同值放在一块内存
<x11> 本来就什么都不干
回复

使用道具 举报

发表于 2004-5-14 09:47:44 | 显示全部楼层
分配内存没有?
char *list[2];
list[0]=malloc(xx);//或者用一个已分配内存的指针给它赋值
list[1]=malloc(xx);//或者用一个已分配内存的指针给它赋值
...................
free(list[0]);
free(list[1]);
回复

使用道具 举报

发表于 2004-5-14 11:22:29 | 显示全部楼层
char*list[2]

这只是声明了char类型指针,并未给其分配内存.而指针初始化时并为NULL
一个指针如果为NULL, free多少次都不会出错.
回复

使用道具 举报

 楼主| 发表于 2004-5-14 16:37:20 | 显示全部楼层
谢谢小楼,也谢谢大家,其实这个问题对我来说并不是非常急迫,而且在规范的使用中也不应该出现这个问题,因为指针总要先初始化嘛,不过我还是想知道它到底是怎么回事。

回mozilla:没有分配内存,是一个野指针数组。
因为要多次使用,所以我想每次使用时都先free()再realloc(),所以会对它进行free()。然后就会出错。其实如果我在第一次使用前就令其为NULL的话是不会出错的,而且以后再free(),realloc()多少次都不会出错就象steron说的一样。但是由于数组不方便直接初始化,就忘了,然后就出现错误。

我想在malloc()或者realloc()的时候是不是编译器设置了什么标志来表示这个动态内存块的结束,所以在指针不为NULL并且找不到这个标志来结束的情况下,free()函数操作越界了????

真是寒自己的程序,怎么什么奇怪问题都遇到了,看来程序结构还不是很好。还要继续努力,呵呵
回复

使用道具 举报

发表于 2004-5-15 10:48:26 | 显示全部楼层
free(list[0]);
free(list[1]);

free之后指针不会为NULL, 这样就比较完整了
list[0] = list[1] = NULL;
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-8 08:42 , Processed in 0.051438 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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