2016-04-14 70 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的用戶處理之前被某些代碼取消分配或覆蓋,那麼您正在查看未定義的行爲。

相關問題