Я предполагаю, что void* ptrArr[100]
на самом деле const char* ptrArr[100]
. void*
может быть буквально чем угодно, поэтому невозможно ответить на вопрос без предположения о типе.
Итак, вам нужны две вещи: вам нужно выполнить преобразование между типами (в том числе из кодовых точек Unicode в символы ANSI), и у вас должно быть что-то, владеющее этой памятью.
Есть несколько вариантов того, что должно удерживать неуправляемую память для const char*
. Самым дорогим маршрутом является Marshal.StringToHGlobalAnsi
, но это боль, поэтому мы собираемся пропустить это. (Для этого потребуется вручную отслеживать группу IntPtr
и вручную вызывать FreeHGlobal
, когда закончите.)
Другие варианты - это различные вызовы marshal_as
.
Вы можете преобразовать все String^
экземпляры в std::string
экземпляры и извлечь из них const char*
. Я рекомендую marshal_as<std::string>
для этого. В этом случае память принадлежит экземплярам std:string
, поэтому ptrArr
будет действовать только до тех пор, пока stdStrArr
.
#include <msclr\marshal_cppstd.h>
array<String^>^ strArr = gcnew array<String^>(100);
std::string stdStrArr[100];
const char* ptrArr[100];
for (size_t i = 0; i < 100; i++)
{
stdStrArr[i] = marshal_as<std::string>(strArr[i]);
ptrArr[i] = stdStrArr[i].c_str();
}
// Memory for ptrArr deallocated when stdStrArr goes out of scope.
Другой вариант - использовать marshal_as
для прямого преобразования в const char*
. Для этого вы выделяете вспомогательный объект. В этом случае память принадлежит экземпляру marshal_context
, поэтому ptrArr
будет действовать только до тех пор, пока context
.
#include <msclr\marshal.h>
array<String^>^ strArr = gcnew array<String^>(100);
marshal_context^ context = gcnew marshal_context();
char* ptrArr[100];
for (size_t i = 0; i < 100; i++)
{
ptrArr[i] = context->marshal_as<const char*>(strArr[i]);
}
// Memory for ptrArr deallocated when you call `delete context`, or when it's garbage collected.
Дальнейшее чтение:
Примечания:
- Я не проверял свой синтаксис с помощью компилятора. Там могут быть небольшие ошибки.
- Кажется, должен быть вопрос, чтобы пометить этот как дубликат. Однако мне не удалось найти вопрос «преобразовать строку в символ *», который был бы высоко оценен, в ответе использовался
marshal_as
и показал хороший пример его использования.