不能在另一个函数中由 malloc() 分配 free() 值

标签 c memory-management buffer-overflow

我有一个 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/

相关文章:

c - 我正在尝试解决这个问题,我已经尝试过,但我不知道如何通过代码或逻辑解决这个问题

c - 我在最终返回时没有得到正确的返回值

java - 增加 Android 应用程序中的初始可用内存量

c - 什么可能导致此缓冲区溢出?

c - 缓冲区溢出返回地址有 00

c++ - 如何一次将多个值分配给一个结构体?

c - MS3D 解析 : boneID == joint ID?

c - 在 C 中读取执行程序标准输出的更好方法

linux - *nix 中的等效 win API

c++ - 使用 Visual Studio 在 C++ 程序中调试缓冲区溢出的工具?