我有一个 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. */
}
当我打电话时:
自由(出);
它给出了:
*** 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;
和 *out = strdup(myvariable)
但 free( )
调用给出同样的错误。
更新
我发现问题出在函数内部。在其中调用任何 free()
,都会导致下一个尺寸无效。
例如:
char *f=malloc(2);
strcpy(f,"a");
free(f);
在foo()
函数中,出现上述错误,在main()
函数中,正常运行。我完全不知道如何解决这个问题。
最佳答案
您可能已经超出了分配数组的范围,从而破坏了堆(其中包含 malloc
/free
用于管理事物的元数据)。
Valgrind 等工具旨在帮助您发现此类错误。
关于不能在另一个函数中由 malloc() 分配 free() 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339547/