1

我有一个 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("%s\n", 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()电话.. 或者不是,实际上,我不知道。*out = myvariable;我也尝试在函数 alloc 值中为其创建一个新变量,然后调用给出相同*out = strdup(myvariable)的错误。free()

更新

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

例如:

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

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

4

3 回答 3

5

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

Valgrind 等工具旨在帮助您发现此类错误。

于 2012-04-26T18:52:36.403 回答
0

对我有用,但我没有计算大小的 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("%s\n", out); /* so far, it works fine */
   free(out); /* the problem. */ 
   exit(0);
}
于 2012-04-26T18:58:34.057 回答
0

解决方案:

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

于 2012-04-26T20:51:17.257 回答