我一直对此很好奇-为什么在C++中我必须从malloc开始转换返回值,而在C中却不是?

下面是C++中的例子:

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

这里是C++中不工作的例子(没有强制转换):

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

我听说在C语言中,实际上,从malloc()开始计算输出是一个错误.

有没有人能对这个话题发表 comments ?

推荐答案

有几点:

C允许将void指针隐式转换为任何其他对象指针类型.C++没有.

如果你忘了包括stdlib,在C中投射malloc()的结果将压制一个有用的诊断.h或其他情况下,范围内没有malloc()的声明.请记住,如果C看到一个函数调用没有事先声明,它将假定该函数返回int.如果您没有malloc()的声明,并且没有强制转换,那么您将得到一个诊断,大意是您正在try 分配不兼容的类型(int到指针).如果强制转换结果,则会禁用诊断,并且可能会出现运行时问题,因为不能保证将指针值转换为int并再次转换为指针会得到有用的结果.

如果您正在编写C++,您应该使用newdelete,而不是malloc()free().是的,我听说了人们希望他们的代码同时编译为C和C++的所有原因,但是为该语言使用正确的内存管理工具的好处超过了维护两个版本IMO的成本.

注:C89标准中增加了void *型;早期版本的C有malloc()返回char *,因此在这些版本中,如果要将结果分配给不同的指针类型,则需要强制转换was.不过,几乎所有人都至少支持C89标准,因此,您遇到这些较旧实现的可能性非常非常低.

C++相关问答推荐

C/C++中的状态库

为什么PLT表中没有push指令?

为什么可以通过指向常量int的指针间接地改变整数的值?

将常量转换为指针会增加.数据大小增加1000字节

双指针指向常量双指针的指针类型赋值不兼容

C-使用指针返回修改后的整数数组

如何在C语言中正确打印图形

Tic-tac-toe:从文件加载存储

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

生产者消费者计数器意外输出的C代码

OMP并行嵌套循环

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

关于不同C编译器中的__attribute__支持

如何使crc32的结果与cksum匹配?

无法理解 fgets 输出

memcmp 是否保证按顺序比较字节?

C11 嵌套泛型

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?

如何使 clangd 启用仅标头库实现

无法使用 realloc 调整内存块大小