此代码无法在MSVC编译器和gcc(MinGW)上进行编译。
#include <stdlib.h>
int main() {
int *a = malloc(sizeof(int));
free(a);
return 0;
}
编译错误是
错误C2440&#39;初始化&#39;:无法转换为&#39; void *&#39;到&#39; int *&#39;
当然,将分配线更改为
int *a = (int*) malloc(sizeof(int));
使编译成为可能。 为什么需要显式的类型转换?当我分配其他类型的数据(例如struct
或)时,这种方法没有问题。
答案 0 :(得分:3)
您使用的是C ++编译器,可能是由于使用错误的扩展名(.cpp
)
int *a = malloc(sizeof(int));
在C中有效。存在从任何对象指针类型到void *
的隐式转换。
在C ++中它无效(因为它的强类型是C),没有这样的隐式转换,你需要一个强制转换:
int *a = (int*)malloc(sizeof(int));
int *a = static_cast<int*>(malloc(sizeof(int));
如果您使用的是C ++,则可以/应该使用new
和delete
运算符。
int *a = new int();
delete a;
答案 1 :(得分:2)
要么您的文件命名错误,要么使用了错误的编译器。
如果您的文件有 .cpp 或 .cxx 扩展名,请将其更改为 .c ,否则请确保编译器是交流编译器,不是c ++。
在c ++中需要显式转换,实际上它看起来像
int *a = static_cast<int *>(malloc(sizeof(int));
并且永远不会使用c编译器进行编译。