2016-04-14 68 views
0

我正在为第三方.dll创建C++包装器,以便在C#P/Invoke中使用它。为此,我可以访问使用该.dll的演示应用程序,由于我不是C专家,因此我非常依赖此代码。一切工作正常,但几个星期前,我碰到一些代码,我发现相当奇怪传来:将char *值存储到无符号char **数组中

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循环困扰了我一段时间,但这些线路在第一行密切关注,我想“嘿,这一定意味着一个无符号的字符指向一个int ...对吗?'

是的,我仍然不太确定,但我已经使用了相同的概念几种不同的类型和它的作品。在任何人想知道原因的情况下,我必须将不同类型的值存储到这个无符号字符**中,并将其传递给第三方.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中向那些善良的人留下建议。任何帮助,将不胜感激。

¹如果我错了,请赐教!

+1

new char *;意思是“分配一个指向char的指针”;一个指针是一个int;即4或8字节(取决于32/64位)。 – Exceptyon

回答

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[]

+0

奇妙的是,你的第一个例子运行平稳...或者说...它是reinterpret_cast,而不是reinterpret_char,但这是一个诚实的错误!非常感谢! – makoshichi

+0

顺便说一句,谢谢你提醒我删除 – makoshichi

0

但它不工作得如我所料

这是因为串,即空值终止char* S,是不一样的基本类型。你正在传递一个指针。如果指针指向的内存在由ppucValues的用户处理之前被某些代码取消分配或覆盖,那么您正在查看未定义的行为。

相关问题