这是我的代码。
struct MemoryStruct {
char *memory;
size_t size;
};
struct MemoryStruct *mem = &state->characters;
mem->memory = realloc(mem->memory, mem->size + len + 1);
当我在' C'中运行此代码时并通过gcc编译,我没有得到任何错误。
但是同样的代码,我用C ++运行并用g ++编译它,我得到错误
错误:无效转换为'void *'到'char *'[-fpermissive]
为什么它确实在C ++中出错并且没有在C中给出错误
答案 0 :(得分:9)
为什么它确实在C ++中出错并且没有在C中给出错误
因为这些语言的规则不同。在这种特殊情况下,不同之处在于C ++不允许从void*
转换为char*
,而C则允许转换。这就是编译器错误告诉你的。
答案 1 :(得分:3)
C ++给出了一个错误,因为没有从void *到char *的隐式转换(至少在最近的编译器中)。
如果您希望此代码在C ++中编译,则必须转换为正确的类型:
mem->memory = static_cast<char*>(realloc(mem->memory, mem->size + len + 1));
或者,如果你想保持C兼容性:
mem->memory = (char*)realloc(mem->memory, mem->size + len + 1);
但是如果你切换到C ++,最好使用C ++对象,比如std::vector
,它会为你做realloc。
答案 2 :(得分:2)
在C ++中,您需要转换malloc
和朋友返回的值:
mem->memory = (char*)realloc(mem->memory, mem->size + len + 1);
答案 3 :(得分:1)
简单就是C和C ++都是不同的语言C启发结构但是C ++激发结构以及面向对象的范例在你的情况下c有能力将void *转换为char * builtin属性但是c ++没有这种类型的属性c ++无法将void *转换为char *,这就是为什么编译器会抛出错误。