C和C ++上的转换错误无效

时间:2016-05-03 08:06:20

标签: c++ c

这是我的代码。

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中给出错误

4 个答案:

答案 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 *,这就是为什么编译器会抛出错误。