free():使用递归在C中无效的下一个大小(快)错误

时间:2015-08-21 07:15:14

标签: c recursion malloc free

以下是我的代码中创建错误的一部分。

int check(int size, char *string)
{
     if(condition)
     {             
         char *tempStr = (char*)calloc(size, sizeof(char));                                         
         /*
         some code here to put some string value to tempStr;
         */
         res += check(size,tempStr);
         free(tempStr);
     }
}

我已经阅读并理解当我们尝试释放不可用的内存或者我们尝试多次释放内存时会发生无效的下一个错误(假设这是我的情况)。

如何解决上述错误?在递归时,上述方法是否正确释放内存?

2 个答案:

答案 0 :(得分:3)

根据free()的{​​{3}},我们可以看到,free()的签名是

  

void free(void *ptr);

所以,在你的代码中,

free(size,tempStr);

错了。我担心,你可能错过了stdlib.h头文件本身。这使得下一个评论甚至更有效,

  • malloc() C及其家人在free()中的回复价值man page

编辑后:

在之前链接的同一手册页中,提到了

  

/* some code here; */ 函数释放ptr指向的内存空间,必须由之前调用malloc(),calloc()或realloc()返回。否则,或如果之前已经调用过free(ptr),则会出现未定义的行为。

所以,在里面

tempStr

您无法更改tempStr = "somesting"。根据你所展示的代码,我们可以说这就是全部。

根据您的意见,

  

“将字符串插入tempStr”

我最好的选择是你正在做malloc()(一个 assignement ,而你应该做see why not to cast),这会导致

  1. 丢失malloc()内存,造成内存泄漏。
  2. 将非! ed指针传递给free,创建strcpy()

答案 1 :(得分:2)

C中的自由函数只接受一个参数,即自由指针。

通过给它一个大小,比方说15,你可以随意释放地址15处的内存,这不是malloc'd。

不要忘记包含stdlib.h,这样您的编译器就会知道它只需要一个参数。 (它应该在编译时纠正警告)