在用free时出错?

clzzcl 2004-04-21 01:04:18
/*动态加tokenString*/
void AddtokenString(char c,int pos)
{
int ii;
char *temp;
if (!tokenStrLen)
{
tokenNum++;
temp = (char *)malloc(tokenNum * SPACELEN * sizeof(char));
tokenStrLen += SPACELEN;
for (ii=0; ii<(tokenNum-1)* SPACELEN; ii++)
temp[ii] = tokenString[ii];
free(tokenString); /*这里出错after normal block(#44)....
tokenString = temp;
}
*(tokenString + pos) = c;
*(tokenString + pos + 1) = '\0';
tokenStrLen--;
}

大家帮帮看看吧!我怎么也想不通怎么会出错
...全文
145 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
clzzcl 2004-04-26
  • 打赏
  • 举报
回复
freefalcon没在了吗
clzzcl 2004-04-25
  • 打赏
  • 举报
回复
偶明白了,不知为什么编绎器会定位到free()这句出错,而不是在内存越界那里出错!
想不通!
freefalcon(心宇) 大侠有没有什么方法检查是否越界存储呀!我的意思是在编程的时候就预防一下。这样人工找错太累了!
楼上的我的e-mail是clzzclzz@hotmail.com 有什么问题可以一起交流

ync111 2004-04-25
  • 打赏
  • 举报
回复
本人在作浙江大学上的题 以作了几十题
但没到题都要发送好多编才能对
有那位大哥大姐愿意和我一起做的; 以求共同发展;
请记下我的QQ:284301276或272656303
我的邮箱:ync999@163.com
clzzcl 2004-04-25
  • 打赏
  • 举报
回复
没人看了吗?
freefalcon 2004-04-25
  • 打赏
  • 举报
回复
*(tokenString + pos + 1) = '\0';访问越界了
因为是等到tokenStrLen为0时才重新分配,这时pos+1已经超过了分配的空间,所以在分配空间后,增加一句tokenStrLen--; 目的是为'\0'预留空间

#define SPACELEN 10
char *tokenString; /*是全局的*/
int tokenStrLen = 0,tokenNum = 0;

/*动态加tokenString*/
void AddtokenString(char c,int pos)
{
int ii;
char *temp;
if (!tokenStrLen)
{
tokenNum++;
temp = (char *)malloc(tokenNum * SPACELEN * sizeof(char));
tokenStrLen += SPACELEN;
for (ii=0; ii<(tokenNum-1)* SPACELEN; ii++)
temp[ii] = tokenString[ii];
free(tokenString);/*有内存泄漏必须要这句*/
tokenString = temp;
tokenStrLen--; /*增加这一句*/
}
*(tokenString + pos) = c;
*(tokenString + pos + 1) = '\0';
tokenStrLen--;
}

void main()
{
for(int i=0; i<10; i++)
AddtokenString('b', i);
printf("%s", tokenString);
free(tokenString); /*记住释放*/
}
clzzcl 2004-04-25
  • 打赏
  • 举报
回复
看函数的最后一句
tokenStrLen--;

freefalcon 2004-04-25
  • 打赏
  • 举报
回复
if (!tokenStrLen) //楼主觉得这里会执行多次吗,第一次tokenStrLen为0,第二次呢...
clzzcl 2004-04-25
  • 打赏
  • 举报
回复
等待。。。。
clzzcl 2004-04-24
  • 打赏
  • 举报
回复
我觉得不是逻辑上的问题
楼上的把下面这个10调小一点就会有错了
#define SPACELEN 10
moswawa 2004-04-22
  • 打赏
  • 举报
回复
我调了一下用下面这个,没有出错...
void main(){
int i;
for(i = 0; i < 10; i++)
AddtokenString(i + '0', i);
printf("%s", tokenString);
}
我不知道你的其它function.这个函数逻辑上灭问题.
lhj821130 2004-04-22
  • 打赏
  • 举报
回复
楼上说的有理。。。
zp518 2004-04-22
  • 打赏
  • 举报
回复
请楼上的不懂就不要进来
zzxxdd 2004-04-21
  • 打赏
  • 举报
回复
大虾们帮忙搞定呀,小弟也学几招呀

顶~~~~~~~~~~~~~~~~~~~~~~~~~`````

狂顶
clzzcl 2004-04-21
  • 打赏
  • 举报
回复
我觉得不是像大家说的那样
#define SPACELEN 10
char *tokenString; /*是全局的*/
int tokenStrLen = 0,tokenNum = 0;

/*动态加tokenString*/
void AddtokenString(char c,int pos)
{
int ii;
char *temp;
if (!tokenStrLen)
{
tokenNum++;
temp = (char *)malloc(tokenNum * SPACELEN * sizeof(char));
tokenStrLen += SPACELEN;
for (ii=0; ii<(tokenNum-1)* SPACELEN; ii++)
temp[ii] = tokenString[ii];
/* free(tokenString);有内存泄漏必须要这句*/
tokenString = temp;
}
*(tokenString + pos) = c;
*(tokenString + pos + 1) = '\0';
tokenStrLen--;
}
跟踪第一次没错的,我想是因为tokenString是空的没空间,第二次再进来时tokenString是指向第一次temp分配的空间的这时temp已经没了.我又给temp分配了更多的空间(不是上次分配的空间)然后把tokenString指向的空间中的内容拷贝给temp新分配的空间,然后将tokenString原来的空间释放(这时出错了),再让它指向新分配的空间.这样就可以把新传进来的字符拷贝进tokenString去了
zhouqingyuan 2004-04-21
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <stdio.h>
int *p;
void myfree()
{
free(p);
p=NULL;
}
void main(void)
{
p=(int*)malloc(sizeof(int));
myfree();

}
你的tokenstring没有传入函数,怎么free,还有上面那样说的不对的
free后虽然指针不为NULL,但那块内存已经被回收,不能再使用的。
zhouqingyuan 2004-04-21
  • 打赏
  • 举报
回复
tokenString你没有传进来!或者如果tokenString是全局变量也是可以的
#include <stdlib.h>
int *p;
void myfree()
{
free(p);
p=NULL;
}
void main(void)
{
p=(int*)malloc(sizeof(int));
myfree();

}
这样是可以的 。
单free后p虽然是不为NULL,但那块空间已经被回收,已经不能用了。
goodluckyxl 2004-04-21
  • 打赏
  • 举报
回复
free 只是把申请的空间释放掉
它依然是指针类型可以使用的
zhang5765 2004-04-21
  • 打赏
  • 举报
回复
在上面free掉了,下面还用tokenString = temp;赋值。怎么赋?
moswawa 2004-04-21
  • 打赏
  • 举报
回复
你看一下while第一次执行的情况..
你就明白了.
eliner 2004-04-21
  • 打赏
  • 举报
回复
在这里你没有给tokenstring malloc()呀,所以当然会有错了
free应该跟malloc成对使用,但是你也应该保证他们作用在同一个对象上才行呀!
加载更多回复(1)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧