复制LPTSTR的数组

Copy an array of LPTSTR

本文关键字:数组 LPTSTR 复制      更新时间:2023-10-16

我有一个表示LPSTR数组的结构,定义如下:

struct MyStruct {
    DWORD cbString;
    LPTSTR * pbString;
}

我需要将此结构复制到另一个相同的结构。我的问题是,如何为目标结构分配内存?我的第一直觉是:

destStruct.pbString = (LPTSTR*)malloc(totalSizeOfSrcStrings * sizeof(TCHAR))
for(int i = 0; i < srcStruct.cbString; i++) {
    destStruct.pbString[i] = (LPTSTR)malloc(_tcslen(srcStruct.pbString[i] * sizeof(TCHAR));
}

不过,我不确定for循环中的代码是否有必要。

与往常一样,虽然您别无选择,只能在C++中强制转换malloc的结果,但您仍然可以避免在sizeof下使用类型名的无用做法。在您的情况下,第一个malloc中的错误正是由以下原因引起的:对于一些无法解释的原因,您在那里使用了sizeof(TCHAR),而正确的元素大小实际上是sizeof(LPTSTR)

同样,不要在sizeof下使用typename。您的原始malloc可以以更安全的方式重写为

destStruct.pbString = 
  (LPTSTR*) malloc(totalSizeOfSrcStrings * sizeof *destStruct.pbString);

周期可能如下

for(int i = 0; i < srcStruct.cbString; i++)
  destStruct.pbString[i] = 
    (LPTSTR) malloc((_tcslen(srcStruct.pbString[i]) + 1) * sizeof *destStruct.pbString[i]);

附言:当然,在这种情况下,C风格的转换可能也是个坏主意,但代码看起来可能需要交叉编译。

正如brightstar所指出的,它应该是sizeof(CHAR),而不是sizeof(TCHAR)

LPTSTR=TCHAR*

LPSTR=CHAR*