将char *值存储到unsigned char **数组中

时间:2016-04-14 14:13:45

标签: c++ arrays pointers char

我正在为第三方.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上向那些人提出建议。任何帮助将不胜感激。

¹如果我错了,请赐教!

2 个答案:

答案 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的用户处理之前被某些代码解除分配或覆盖,那么您正在查看未定义的行为。