请教下面这段程序要怎么free才能将所有malloc的空间free完。

当凸遇见凹凹 2016-11-10 10:43:07

void data_tok(char *buf)
{
char i = 0,j = 0,n = 0,fla = 0,x,y;
// char *_buf1[30][45];
char *buf2;
char *p = NULL,*q = NULL;
char *data[30];

char *out;
cJSON *root,*rot,*fmt;

p = strstr(buf,"|90|90|");
if(p != NULL)
{
while(q = strstr(p+1,"|90|90|") )
{
data[n] = (char *)malloc(255);
memcpy(data[n],p,q - p);
memset(data[n] + (q-p-1),0,1);
// printf("p:-----------:%s\n",data[n]);

buf2 = data[n];
j = 0;
_buf1[i][j] = (char *)malloc(30);
while((_buf1[i][j]=strtok(buf2,"|"))!=NULL)
{
buf2=NULL;
//printf("%s ",_buf1[i][j]);
_buf1[i][++j] = (char *)malloc(30);
}
p = q;
i++;
n++;
}
if(q == NULL)
{
q = buf + strlen(buf);

data[n] = (char *)malloc(512);
memcpy(data[n],p,q - p);
memset(data[n] + (q-p-1),0,1);
// printf("p:-----------:%s\n",data[n]);

buf2 = data[n];
j = 0;
_buf1[i][j] = (char *)malloc(30);
while((_buf1[i][j]=strtok(buf2,"|"))!=NULL)
{
buf2=NULL;
if(strcmp(_buf1[i][j],"ZS") == 0)
{
_buf1[i][j - 2] = NULL;
--j;
fla = 1;
break;
}
_buf1[i][++j] = (char *)malloc(30);
}
p = q;
i++;
n++;
}
}
printf("\n\n");

chinese(i-1);
/*
for(x = 0;x < i;x++)
{
for(y = 0;y < j;y++)
{
printf("%s ",_buf1[x][y]);
}
printf("\n");
}
*/
char *cont[42];
y = 0;
for(x = 0;x < 42;x++)
{
cont[x] = (char *)malloc(2);
sprintf(cont[x],"%d",x);
}
root=cJSON_CreateObject();
rot=cJSON_CreateArray();

cJSON_AddItemToObject(root, "list",rot);

for(x = 0;x < i;x++)
{
cJSON_AddItemToObject(rot, "a",fmt=cJSON_CreateObject());
if(fla == 0)
{
for(y = 0;y < j ;y++)
{
cJSON_AddStringToObject(fmt,cont[y],_buf1[x][y]);
}
}
else
{
for(y = 0;y < j - 1 ;y++)
{
cJSON_AddStringToObject(fmt,cont[y],_buf1[x][y]);
}
}
}

out=cJSON_Print(root); cJSON_Delete(root);
pubMessage(out,strlen(out));
printf("%s\n",out); free(out);
/*
for(y = 0;y < 42;y++)
{
free(cont[y]);
}
for(x = 0;x < i;x++)
{
free(data[x]);
for(y = 0;y < j;y++)
{
free(cont[y]);
free(_buf1[x][y]);
}
}*/
}
...全文
220 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
当凸遇见凹凹 2016-11-10
  • 打赏
  • 举报
回复
引用 9 楼 shihengzhen101 的回复:
引用 7 楼 dzc_woniu 的回复:
[quote=引用 5 楼 shihengzhen101 的回复:] 你再运行一下,看看崩溃在哪一行?
你这一块代码混乱啊,为什么直接置为NULL了

 while((_buf1[i][j]=strtok(buf2,"|"))!=NULL)
            {
                buf2=NULL;
                if(strcmp(_buf1[i][j],"ZS") == 0)
                {
                    _buf1[i][j - 2] = NULL;
                    --j;
                     fla = 1;
                    break;
                 }
                _buf1[i][++j] = (char *)malloc(30);
            }
[/quote](j-2)置为NULL,是因为前面的两个字符串不要,
AlbertS 2016-11-10
  • 打赏
  • 举报
回复
引用 7 楼 dzc_woniu 的回复:
引用 5 楼 shihengzhen101 的回复:
你再运行一下,看看崩溃在哪一行?
你这一块代码混乱啊,为什么直接置为NULL了

 while((_buf1[i][j]=strtok(buf2,"|"))!=NULL)
            {
                buf2=NULL;
                if(strcmp(_buf1[i][j],"ZS") == 0)
                {
                    _buf1[i][j - 2] = NULL;
                    --j;
                     fla = 1;
                    break;
                 }
                _buf1[i][++j] = (char *)malloc(30);
            }
AlbertS 2016-11-10
  • 打赏
  • 举报
回复
引用 7 楼 dzc_woniu 的回复:
引用 5 楼 shihengzhen101 的回复:
你再运行一下,看看崩溃在哪一行?
崩溃时查一下x和y的值
当凸遇见凹凹 2016-11-10
  • 打赏
  • 举报
回复
引用 5 楼 shihengzhen101 的回复:
你再运行一下,看看崩溃在哪一行?
flying_music 2016-11-10
  • 打赏
  • 举报
回复
没有运行环境,很难调试啊 一般释放内存错误是释放了多次或者堆被破坏了,也就是你放的数据超出了分配的内存,你单步调试一下吧
AlbertS 2016-11-10
  • 打赏
  • 举报
回复
你再运行一下,看看崩溃在哪一行?
当凸遇见凹凹 2016-11-10
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
一个原则, 一次malloc对应一次free 就不会有问题
我是按照这个原则free的,就是不知道是不是free的逻辑有问题,,,感觉我陷入死局了,,所以请大家帮我看看,,,哈哈
当凸遇见凹凹 2016-11-10
  • 打赏
  • 举报
回复
引用 1 楼 shihengzhen101 的回复:
在用完的地方free就行,现在出了什么问题
我是这么free的,但是报错“free(): invalid pointer:”
for(y = 0;y < 42;y++)
721     {
722         free(cont[y]);
723     }
724     if(p_fla != NULL)
725     {
726     for(x = 0;x < i;x++)
727     {
728         if(fla == 0)
729         {
730             for(y = 0;y < j;y++)
731             {
732                 free(_buf1[x][y]);
733             }
734         }
735         else
736         {
737             for(y = 0;y < j-1;y++)
738             {
739                 free(_buf1[x][y]);
740             }
741         }
742     }
743     }
xian_wwq 2016-11-10
  • 打赏
  • 举报
回复
一个原则, 一次malloc对应一次free 就不会有问题
AlbertS 2016-11-10
  • 打赏
  • 举报
回复
在用完的地方free就行,现在出了什么问题
paschen 2016-11-10
  • 打赏
  • 举报
回复
free后将指针设置为NULL,再次free的时候不会出错
赵4老师 2016-11-10
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
AlbertS 2016-11-10
  • 打赏
  • 举报
回复
引用 10 楼 dzc_woniu 的回复:
引用 9 楼 shihengzhen101 的回复:
[quote=引用 7 楼 dzc_woniu 的回复:] [quote=引用 5 楼 shihengzhen101 的回复:] 你再运行一下,看看崩溃在哪一行?
你这一块代码混乱啊,为什么直接置为NULL了

 while((_buf1[i][j]=strtok(buf2,"|"))!=NULL)
            {
                buf2=NULL;
                if(strcmp(_buf1[i][j],"ZS") == 0)
                {
                    _buf1[i][j - 2] = NULL;
                    --j;
                     fla = 1;
                    break;
                 }
                _buf1[i][++j] = (char *)malloc(30);
            }
[/quote](j-2)置为NULL,是因为前面的两个字符串不要,[/quote] 不能理解啊,你这样不就内存泄露了吗?你还没有free,就把指针置为NULL

70,037

社区成员

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

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