2017-10-04 102 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,正如我所见。