4

可能重复:
为什么 C++ 需要对 malloc() 进行强制转换,而 C 不需要?

这段特定的代码在 C 中运行良好,但在编译为 C++ 程序时会出现编译错误。

#include<stdio.h>
#include<stdlib.h>
int main(){
    int (*b)[10];
    b = calloc(20, sizeof(int));
    return 0;
}

C++编译的错误是:

test.cpp: In function ‘int main()’:
test.cpp:9:28: error: invalid conversion from ‘void*’ to ‘int (*)[10]’ [-fpermissive]

知道可能是什么原因吗?

4

3 回答 3

6

虽然在 C 中你可以隐式地从/到 void 指针转换为其他指针类型,但在 C++ 中是不允许的,你需要显式地转换它:

b = (int (*)[10])calloc(20, sizeof(int));
于 2012-11-05T05:48:22.647 回答
1

C++是比 . 更严格的类型检查语言C。因此,您需要手动对其进行类型转换,但在 C 中它会自动进行类型转换。

这里 calloc 返回void*并且b是类型的,int(*)[]因此类型转换是强制性的。

在 C++ 中,您还需要记住其他类型的种姓

<static_cast>
<const_cast>
<reinterpret_cast>
<dynamic_cast>

有关更多信息,请参阅 何时应使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?

于 2012-11-05T06:01:50.290 回答
0

C 在强制转换方面更为宽松,C++ 要求您在强制转换时明确。您也应该将其转换为 C 版本。

于 2012-11-05T05:51:23.967 回答