C语言,刚刚学到malloc,有很大的疑问;

int * p = (int *)malloc (4);

我不明白为什么要进行强制类型转换(int*)

因为赋值的时候,等号左右两边的类型应该是相同的。
由于malloc()返回的是void *,而你左边的变量是int *,类型不匹配,所以在这里加了强行转换。
虽然你不加强行转换也可以,但是编译器会自动帮你转换成int *,所以结果是一样的。

因为malloc返回的是void*,这么设计是因为malloc不知道你需要申请的内存是干毛用的,是做int呢,还是字符串呢,所以返回void*,void*可以指向任何类型,而且指针本身就是一个unsigned int类型,malloc返回的就是你申请的内存的第一个单元的指针,所以强制转换成int*还是指针。

malloc统一返回void指针,它不关心你用的类型,所以需要使用者自己去做类型转换。这样有一个好处malloc实现只要一个void指针返回值,而不需要处理各种类型。

因为没有从void到int的隐式类型转换存在(不像short->int,或者int->long),所以编译器会报错,类型不匹配。
加上强制转换才能编译。

类型转换就是上面说的,然而为什么会出现类型呢?
一个int型的地址是4字节,然而你申请的内存地址返回的是4个字节的首地址,所以当有了类型和首地址之后就可以定位4个字节的内存单元,
只有有了类型才能准确映射内存空间的。

楼上各种详解,不再废话!