C语言关于const char*赋值给char*的问题

因为初次接触C语言,所有写了个简单的转换的函数。

char* converType(const char* xmlContent) //频繁调用,所有xmlContent长度未知,outbuf没法给定长度
{
    char* outbuf;
    int nLen = strlen(xmlContent) + 1;
    char* buf = (char*)malloc(sizeof(char) * nLen);
    strcpy(buf,xmlContent);
    outbuf = buf;
    free(buf);                      //当free完成后,outbuf也受到影响,调试发现buf和outbuf地址一致

    return outbuf;
    
}

注释处的buf和outbuf因为地址是一样的,导致返回outbuf之前内容又也被free了。
因为目前的需求是需要不断的调用这个函数,xmlContent的值不能确定,所有outbuf没有给定长度,不知道该用什么其他方法来解决这个问题,希望各位高手给点建议或者其他思路。

阅读 9.3k
3 个回答

强烈不建议这样写。。

原因就是你说的如果调用者忘记free会导致内存泄漏

可以把函数声明为:char* converType(const char* xmlContent, char* outbuf)

让申请和释放的工作都交给调用者(其实就变成了strcpy)

这种convert不就是脱裤子放屁么.
用的时候直接strcpy就行了,反正释放内存的事你不管谁调用总得干。

你不可以返回free过的内存。一是这个内存已经被回收,如果没有立即使用,可能被其它的代码覆盖数据。二是如果调用者又free,会导致堆损坏。

当然有STL的string就用string吧。
没有的话,有二个方案,
一是约定这个函数返回的内存由调用者free。
二是加参数,char *outbuf和size_t outlen,返回值为int。调用者分配内存,并设定缓冲区大小,如果缓冲区不够,则返回错误。特别的,outlen为0时,直接返回所需内存大小。很多系统API都是这个模式。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题