我可以为char *指针分配void *指针吗?

时间:2014-11-18 14:57:09

标签: c++ pointers void-pointers

我正在编写重新实现malloc功能的代码。我看到了一个男人的示例代码,它有一些像这样的奇怪代码

struct s_block{
   size_t size;    // size per block
   int free;       // whether free flag exist
   t_block pre;
   t_block next;
   void *magic_ptr;
   int padding;    // bytes for padding
   char data[1];   // first byte of data, i.e. the address returned from malloc
};

typedef struct s_block *t_block;
t_block get_block(void *p) {
   char *tmp;  
   tmp = p;
   ...
}

但我使用gcc或g ++编译此代码,错误是“不能使用void *指向char *指针”。 我想知道问题出在哪里? gcc还是g ++?代码是错误的吗?

3 个答案:

答案 0 :(得分:3)

在C ++中,您必须明确地将void*转换为另一种类型:

char *tmp = static_cast<char*>(p);

在C中情况并非如此,您可以在不进行强制转换的情况下为任何指针类型指定void*

答案 1 :(得分:2)

你必须使用显式强制转换来将void*强制转换为任何其他指针,而其他方式则是隐含的。

char* temp = static_cast<char*> (p);

这里需要注意的一点是你的初始指针(目前由void *表示)应该是char *类型,以避免任何问题。

答案 2 :(得分:1)

这是有效的C代码,您获得的错误来自(更严格的)C ++标准。如果要在C ++中编译它,只需将指针明确地转换为char *