int指针类型转换失败

时间:2017-08-21 15:47:01

标签: c pointers malloc

此代码无法在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或)时,这种方法没有问题。

2 个答案:

答案 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 ++,则可以/应该使用newdelete运算符。

int *a = new int();
delete a;

答案 1 :(得分:2)

要么您的文件命名错误,要么使用了错误的编译器。

如果您的文件有 .cpp .cxx 扩展名,请将其更改为 .c ,否则请确保编译器是交流编译器,不是c ++。

在c ++中需要显式转换,实际上它看起来像

int *a = static_cast<int *>(malloc(sizeof(int));

并且永远不会使用编译器进行编译。