2017-10-04 78 views
-1

我有一個char *誰指向的結構。這裏是我的結構:Cast void * to char *

struct prot 
{ 
    int size; 
    unsigned short codeAction; 
    void *data; 
}; 

我恢復sizecodeAction,但現在我想恢復data。 當我施放我最後的8個字節時,我什麼也沒有。

下面的代碼是隻是一個測試,這是一個糟糕的代碼:

char lol[4]; 
for (int i = 0; i < 4; i++) 
    lol[i] = test[i]; 

int size = *(int*)lol; 

char loli[2]; 
int index = 0; 
for (int i = 4; i < 6; i++) 
{ 
    loli[index] = test[i]; 
    index++; 
} 

int code = *(short*)loli; 

char lolo[8]; 
index = 0; 
for (int i = 6; i < size; ++i) 
{ 
    lolo[index] = test[i]; 
    index++; 
} 

void *newData = (char *)lolo; // how can I cast it? 

我怎麼能顯示newData的內容?

+0

您是如何在第一時間寫出數據的?你應該考慮使用一個序列化庫來爲你處理這些東西。 – NathanOliver

+1

在我看來,你會得到比C++標籤更好的c標籤響應。 –

+1

'test'的類型是什麼? –

回答

0

你的問題是,當鑄造lolo你實際上投射了一個指向你定義的字符數組的指針。因此,演員的結果將是指向數組的第一個單元格的指針char

你爲什麼不把它當作一個結構體並定期訪問這些字段?

無論如何,你想使用lolo作爲一個64位類型的指針和訪問它的內容。

void* newData = *((uint64_t*)lolo) 

此外,不要循環,直到在最後for循環,循環只有8倍size,直到lolo已滿。 newData本身的字節數(而不是它指向的)是不變的,在32位機器上是4字節,在64位上是8字節。

最後一件事 - index++,而不是o++。沒有定義o,正如我所見。