我正在为第三方.dll创建C ++包装程序,以便将其与C#P / Invoke一起使用。为此,我可以访问使用此.dll的演示应用程序,而且由于我不是C专家,因此我在很大程度上依赖此代码。一切正常,但是几周前,我遇到了一些我觉得很奇怪的代码:
unsigned char** ppucValues = new unsigned char*[iSize];
for(int i = 0; i < iSize; i++){
ppucValues[i] = (unsigned char *)new int;
*(int *)ppucValues[i] = piValues[i]; //(piValues is int*)
}
for循环内的那些行使我有些困惑,但仔细观察第一行,我想:“嘿,那必须表示一个未签名的char指向一个整数...对吗?”
是的,我仍然不太确定,但是我对几种不同的类型使用了相同的概念,但它确实有效。如果有人想知道原因,我必须将不同类型的值存储到该无符号char **中,然后将其传递给采用该无符号char **的第三方.dll中的方法。这就是制造商在其演示应用程序中所做的工作,因此我将继续进行下去。
解决了这个问题:我必须执行相同的操作,但是现在我使用的是char **(字符串数组),而不是int *或double *或其他任何东西。根据我刚才所说的,这是我想到的:
for(int i = 0; i < iSize ; i++){
ppucValues[i] = (unsigned char *) new char*; //type of ppucValues as unsigned char** and type of ppucValues[i] as char*???
*(char **)ppucValues[i] = ppcValues[i]; //Hmmm... what?!
}
但这并不能达到我的预期(更不用说我对此只有50%的信心)。例如,如果我的输入(ppcValues [i])是“ test”,那么我的输出(ppucValues [i])则显示为“?4”。我可能会冒险建议这是一个与C ++或其指针无关的编码问题,但是我会在StackOverflow上给那些友好的人一些建议。任何帮助,将不胜感激。
¹万一我错了,请赐教!
最佳答案
没有更多上下文,很难给出确定的解决方案,但是如果ppcValues
的生存期至少与ppucValues
一样长(或更长或更长),则就像复制指针一样简单,例如
for(int i = 0; i < iSize ; i++){
ppucValues[i] = reinterpret_cast<unsigned char*>(ppcValues[i]);
}
如果
ppcValues
的生存期短于ppucValues
的生存期,则需要分配足够的内存以容纳ppcValues[i]
中的所有数据并复制它:for(int i = 0; i < iSize ; i++){
ppucValues[i] = new unsigned char[length_of(ppcValues[i])];
std::copy_n(reinterpret_cast<unsigned char*>(ppcValues[i]), ppucValues[i], length_of(ppcValues[i]));
}
length_of
功能取决于ppcValues[i]
的内容。如果它是C样式的字符串,则应使用strlen(ppcValues[i]) + 1
。另请注意,如果使用
new[]
进行分配,则需要使用delete[]
进行释放。