在C中连接两个字符串并动态分配缓冲区

Concat two strings in C and allocate dynamically buffer

本文关键字:字符 两个 字符串 串并 缓冲区 动态分配 连接      更新时间:2023-10-16

我知道已经有人问过这种问题了。我也用这个题目的解决方案进行了测试。然而,我想知道如何使用这种函数没有内存泄漏也没有例外。

注意:LPTSTR ~ char*LPCTSTR ~ const char*

void add_to_buffer(LPTSTR* buffer, LPCTSTR msg) {
    // Determine new size
    int newSize = 0;
    // Allocate new buffer
    if (*buffer == NULL)
        newSize =  _tcsclen(msg) + 1; // strlen()
    else
        newSize = _tcslen(*buffer) + _tcsclen(msg) + 1;
    LPTSTR newBuffer = (LPTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, newSize); // malloc()
    // Do the copy and concat
    if (*buffer == NULL)
        _tcscpy(newBuffer, msg); // strcpy()
    else
    {
        _tcscpy(newBuffer, *buffer);
        _tcscat(newBuffer, msg); // strcat()
        // release old buffer
        HeapFree(GetProcessHeap(), 0, *buffer); // free()
    }
    // store new pointer
    *buffer = newBuffer;
}

测试:

LPTSTR test = NULL;
add_to_buffer(&test, _T("User:rn"));
add_to_buffer(&test, _T("42"));

第一次调用add_to_buffer工作。然而,第二个函数调用在HeapFree处导致异常。我确信这是一个关于指针的问题,但我不明白如何修复它。

这是一个好方法吗?如何修复我的异常?

如果您将代码编译为多字节应用程序,那么这一行

LPTSTR newBuffer = (LPTSTR)HeapAlloc(
  GetProcessHeap(), 
  HEAP_ZERO_MEMORY, 
  newSize
); 

可能分配到很少的内存。

修改:

LPTSTR newBuffer = (LPTSTR)HeapAlloc(
  GetProcessHeap(), 
  HEAP_ZERO_MEMORY, 
  newSize * sizeof(*newBuffer)
); 

除此之外,代码缺少对系统调用的错误检查,代码看起来很好。

然而,为了简化事情,可以使用HeapReAlloc()而不是HeapAlloc()HeapFree()的组合。

如果程序崩溃了,这可能是由于在实际崩溃之前内存管理已经被打乱了。

如果你的程序是unicode启用的,你没有分配足够的内存-因为字符串长度(以符号表示)和字符串大小(以字节表示)不匹配。

如果不是,我不认为有理由使用非标准c类型而不是标准c类型。这应该不成问题。