我正在为第三方.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-loop里面的那些线条困惑了我一段时间,但是仔细观察第一行,我想“嘿,那必须意味着一个无符号的char指向一个int ......对吧?”
是的,我对此仍然不太确定,但我对几种不同的类型使用了相同的概念并且它有效。如果有人想知道原因,我必须将不同类型的值存储到这个unsigned char **中,然后将它传递给第三方.dll中的一个方法,显然需要这个unsigned char **。这就是制造商在他们的演示应用程序中所做的事情,所以我只是选择它。
有了这个问题,我的问题是:我必须做同样的操作,但现在我正在使用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上向那些人提出建议。任何帮助将不胜感激。
¹如果我错了,请赐教!
答案 0 :(得分:1)
如果没有更多的上下文,很难给出明确的解决方案,但如果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[]
释放。
答案 1 :(得分:0)
但它并不像我预期的那样有效
那是因为字符串,即空终止char*
s,与基本类型不同。你正在传递指针。如果指针指向的内存在ppucValues
的用户处理之前被某些代码解除分配或覆盖,那么您正在查看未定义的行为。