【问题标题】:segfault on free() a pointer to char*free() 上的段错误指向 char* 的指针
【发布时间】:2013-06-26 19:33:40
【问题描述】:

当我使用malloc() 分配内存时,free() 函数出现问题。

程序运行时,会产生分段错误。我生成了程序的核心转储。当我使用 gdb 时,它在对 free() 的调用中显示段错误。

这是我的代码:

char * temp_filename;
temp_filename = (char *) malloc(50);
temp_filename = strrchr(package->_local_filename, '/');
strcat(package->_cache_filename, temp_filename);
free(temp_filename);

我无法弄清楚我的错误。有没有人帮我找出我的错误? 谢谢 *抱歉,代码错误,现在可以了*

【问题讨论】:

  • 您不会在 malloc 和 free 之间的任何地方使用 temp_filename。你确定这就是你所有的相关代码吗?
  • 另外,你确定在线上没有发生段错误吗?当package->cache_filename 没有为自己指向足够的分配内存加上temp_filename_dest 的长度时,strcat 可能会出现段错误。
  • 感谢你们的帮助!现在我知道我的错误了!

标签: c segmentation-fault malloc free


【解决方案1】:

您用指向您正在搜索的其他字符串的指针覆盖分配的指针:

temp_filename = (char *) malloc(50);
temp_filename = strrchr(package->_local_filename, '/');

然后,您错误地释放了该指针,因为它不再是 malloc() 返回的指针:

free(temp_filename);

要修复,请删除分配和释放的代码。

char * temp_filename;
temp_filename = strrchr(package->_local_filename, '/');
strcat(package->_cache_filename, temp_filename);

【讨论】:

  • 而且我无法释放“temp_filename”使用的内存?
  • @VitorLuis:在strrchr() 调用之后,您已经覆盖了指针值,因此您从未使用过该内存。所以,你一开始就不能打电话给malloc()
【解决方案2】:

问题是temp_filename 没有指向使用malloc() 分配的内存。相反,它包含指向package->_local_filename 的指针:

temp_filename = strrchr(package->_local_filename, '/');

您可以删除对malloc()free() 的调用,因为它们是不必要的。

【讨论】:

    【解决方案3】:

    尝试使用 strncat 代替 strcat,并确保没有溢出分配的缓冲区的末尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多