我正在编写重新实现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 ++?代码是错误的吗?
答案 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 *
。