【问题标题】:int pointer type casting failsint 指针类型转换失败
【发布时间】:2017-08-21 15:47:00
【问题描述】:

此代码在 MSVC 编译器和 gcc (MinGW) 上均无法编译。

#include <stdlib.h>
int main() {
    int *a = malloc(sizeof(int));
    free(a);
    return 0;
}

编译错误是

错误 C2440 'initializing':无法从 'void *' 转换为 'int *'

当然,把分配线改成

int *a = (int*) malloc(sizeof(int));

使编译成为可能。 为什么需要显式类型转换?当我分配其他类型的数据(如 struct 或 )时,这种方法没有问题。

【问题讨论】:

    标签: c pointers malloc


    【解决方案1】:

    您使用的是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;
    

    【讨论】:

    • 一种编程语言的名称不是代码,所以请不要将其格式化。
    • 先生,是的,先生!
    【解决方案2】:

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

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

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

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

    这永远不会用 编译器编译。

    【讨论】:

    • 我确实偶然使用了.cpp 扩展名。谢谢!
    • @WardSegers 一些 IDE 认为你永远不会编写 c 代码,有些是专门的 c++ IDE,所以这可能不是你的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2021-09-20
    • 2014-02-06
    • 2023-04-09
    • 2021-02-22
    相关资源
    最近更新 更多