簡體   English   中英

將char *值存儲到無符號char **數組中

[英]Storing a char* value into a unsigned char** array

我正在為第三方.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的生存期至少與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[]進行釋放。

但這並不完全符合我的預期

這是因為字符串(即以null結尾的char*與基本類型不同。 您正在傳遞一個指針。 如果指針指向的內存在被ppucValues的用戶處理之前被某些代碼釋放或覆蓋,則您正在查看未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM