我有一个 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()
函数上,工作正常。我完全迷失了如何解决这个问题。