user-0 提问: 请教下面这段程序要怎么free才能将所有malloc的空间free完。

回复:
user: user-0
content: 引用 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，是因为前面的两个字符串不要，

user: user-1
content: 引用 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);             }

user: user-1
content: 引用 7 楼 dzc_woniu 的回复:引用 5 楼 shihengzhen101 的回复:你再运行一下，看看崩溃在哪一行？崩溃时查一下x和y的值

user: user-0
content: 引用 5 楼 shihengzhen101 的回复:你再运行一下，看看崩溃在哪一行？

user: user-2
content: 没有运行环境，很难调试啊 一般释放内存错误是释放了多次或者堆被破坏了，也就是你放的数据超出了分配的内存，你单步调试一下吧

user: user-1
content: 你再运行一下，看看崩溃在哪一行？

user: user-0
content: 引用 2 楼 xian_wwq 的回复:一个原则， 一次malloc对应一次free 就不会有问题我是按照这个原则free的，就是不知道是不是free的逻辑有问题，，，感觉我陷入死局了，，所以请大家帮我看看，，，哈哈

user: user-0
content: 引用 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     }

user: user-3
content: 一个原则， 一次malloc对应一次free 就不会有问题

user: user-1
content: 在用完的地方free就行，现在出了什么问题

user: user-4
content: free后将指针设置为NULL，再次free的时候不会出错

user: user-5
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按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; }

user: user-1
content: 引用 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