2014-10-14 3 views
-4

У меня есть структура, которая представляет собой массив LPSTR и определяются как так:Копировать массив LPTSTR

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.

+1

Что такое 'LPSTR'? – kraskevich

+0

Насколько я помню, это должно быть 'char *', поэтому sizeof (TCHAR) должен быть sizeof (CHAR) – marcinj

+0

Длинный указатель на строку. Определено (Microsoft) как массив из 8 бит символов. –

ответ

2

Как обычно, в то время как у вас нет выбора но для того, чтобы привести результат malloc в C++, вы все же можете избежать бесполезной практики использования typenames под sizeof. В вашем случае ошибка в вашем первом malloc вызвана именно тем, что: для некоторого необъяснимого резонанса вы использовали sizeof(TCHAR), тогда как правильный размер элемента на самом деле sizeof(LPTSTR).

Опять же, не используйте typenames под sizeof. Ваш оригинальный 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]); 

P.S. Конечно, приведение в стиле C в этом случае также может быть плохой идеей, но код выглядит как нечто, что, возможно, необходимо перекрестно скомпилировать.

+0

Итак, первый malloc должен быть srcStruct.cbString * sizeof (LPTSTR), а затем использовать цикл for как написано? –

+0

Am i daft?Разве sizeof (LPTSTR) просто не возвращает размер указателя вместо размера символьного типа? –

+0

Ах да, он хочет массив LPTSTR ... perfect –

0

Как Brightstar отметил, что должно быть SizeOf (Char), не SizeOf (TCHAR)

LPTSTR = TCHAR *

LPSTR = CHAR *

+1

К сожалению для вас в вопросе есть опечатка. Теперь, когда это исправлено, ваш ответ неверен. –

Смежные вопросы