开辟空间为什么前面要强制转换一下?解决方法

开辟空间为什么前面要强制转换一下?
char *p;
p=(char *)malloc(5*sizeof(char));
为什么不能将第二句写成:p=malloc(5*sizeof(char));

------解决方案--------------------
char *p;
p=malloc(5*sizeof(char));//这样是通不过编译的,至少vc是通不过的...


error C2440: “=”: 无法从“void *”转换为“char *”
1> 从“void*”到指向非“void”的指针的转换要求显式类型转换
------解决方案--------------------
原型:extern void *malloc(unsigned int num_bytes); 

------解决方案--------------------
C里面这样写没问题,C++不行,malloc返回是void*的指针
------解决方案--------------------
因为c++中void*无法直接转换到其它 type*.
c中可以。
于是,c++发明了new,来代替malloc之类的。这样,也不用转换了。。