我有一个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()
没有按预期工作,并因此存储了一些无效值。这导致了堆损坏。