c语言 - 不能在另一个函数中由 malloc() 分配的 free() 值



我有一个C函数,像这样:

void foo(char ** out) {
     *out = malloc(computedsize);
     if(*out != NULL){
         sprintf(*out, "%s,%s", foovar, baa);
      }
}

然后我打电话:

int main(void) {
   char * out = NULL;
   foo(&out);
   printf("%sn", out); /* so far, it works fine */
   free(out); /* the problem. */ 
}

当我打电话时:

free(out);

它给出了:

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x09a03050 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0x4ff161]
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0x5009b8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x503a9d]
./a.out[0x804875b]
./a.out[0x804871a]
./a.out[0x80486f9]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x4aabd6]
./a.out[0x8048601]
======= Memory map: ========

需要复制内存映射部分吗?

有人可以指出我的错误吗?我相信这就是sprintf()呼吁。或者不,实际上,我不知道。我也尝试在函数 alloc 值中为其创建一个新变量,然后*out = myvariable;*out = strdup(myvariable)free()调用给出了相同的错误。

更新

我看到问题出在函数内部。它内部的任何free()调用都会导致下一个大小无效。

例如:

char *f=malloc(2);
strcpy(f,"a");
free(f);

在函数内部foo(),得到上述错误,main()函数上,工作正常。我完全不知道如何解决这个问题。

您可能已经超出了分配数组的范围,从而损坏了堆(其中包含malloc/free用来管理事物的元数据)。

像Valgrind这样的工具旨在帮助您找到此类错误。

对我有用,但我没有 computedsize foo 或 baa。我同意您可能已经写了超出您分配的内存的末尾。

#include <stdio.h>
#include <stdlib.h>
#define COMPUTEDSIZE 1024
void foo(char ** out) {
     *out = malloc(COMPUTEDSIZE);
     if(*out != NULL){
         sprintf(*out, "%s,%s", "foo", "baa");
      }
}
int main(int argc, char * argv[]) {
   char * out = NULL;
   foo(&out);
   printf("%sn", out); /* so far, it works fine */
   free(out); /* the problem. */ 
   exit(0);
}

解决方案:

实际上,问题出在以前的malloc()上。if() 声明调用另一个也执行malloc()的函数,但内部调用函数的if()没有按预期工作,并因此存储了一些无效值。这导致了堆损坏。

最新更新