Why does C++ require a cast for malloc() but C doesn't?
我一直对此感到好奇-为什么在C++中我必须从EDCOX1的0返回,而不是在C中转换返回值?
下面是C++中的例子:
1
| int *int_ptr = (int *)malloc(sizeof(int*)); |
这里是C++中不起作用的例子(没有强制转换):
1
| int *int_ptr = malloc(sizeof(int*)); |
我听说在C语言中,实际上,从malloc()转换输出是一个错误。
有人能就这个话题发表评论吗?
- C++对类型敏感,需要通过强制类型来指定精确类型。
- 这与你的问题没有直接关系,但我认为你想要的是sizeof(int),而不是sizeof(int*)。也就是说,使用sizeof *int_ptr更好,它可以保证为int_ptr所指向的任何类型分配正确的内存量。
- 为什么在C++中使用MALOC?
- 在C中,演员表没有错,但完全没有必要。在C++中,使用EDCOX1、4或EDCOX1、5的任何东西(除了使用为C设计的接口)几乎肯定是一个错误。
- @ R.。去学D或者去什么的
几点:
C允许将空指针隐式转换为任何其他对象指针类型。C++没有。
如果您忘记在C中包含stdlib.h或在范围内没有对malloc()的声明,那么将malloc()的结果强制转换为C将支持有用的诊断。记住,如果C看到一个没有事先声明的函数调用,它将假定函数返回int。如果您没有为malloc()声明,并且不使用强制转换,那么您将得到一个诊断结果,即您试图分配不兼容的类型(int到pointer)。如果强制转换结果,则会抑制诊断,并可能出现运行时问题,因为不能保证将指针值转换为int并再次转换回指针会给出有用的结果。
如果你正在编写C++,你应该使用EDCOX1,11,EDCOX1,12,而不是EDCOX1,5,EDCX1,14。是的,是的,是的,我已经听说了人们想要把代码编译成C和C++的所有原因,但是使用正确的内存管理工具的好处超过了维护两个版本IMO的成本。
注:c89标准中增加了void *类型;c的早期版本中malloc()返回char *,因此在这些版本中,如果将结果分配给不同的指针类型,则需要强制转换。不过,几乎每个人都支持至少C89标准,因此您遇到这些旧实现之一的几率非常非常低。
- 不管是否存在强制转换问题,难道现代编译器都不会输出malloc()声明缺失的警告吗?
- @丹尼尔:那也取决于你的警告级别。强制转换警告通常显示在比缺少声明更低的警告级别中。
- 也许吧,但不管怎样,最好还是离开这家公司。
这是因为C++是一种强类型语言。在C++中,只有在"加宽"时才允许隐式转换,也就是说,如果新类型可以保存旧类型所能保存的每一个值。允许从较小的整数类型转换为较大的整数类型;允许从任何指针类型转换为void*;允许从子类转换为其超类。所有其他类型的转换都必须显式地进行,从而告诉编译器"我知道我在做什么,这不是一个错误"。
malloc()返回void*,它可以是任何东西,因此编译器不能保证您的强制转换成功(或有意义)。通过使用显式类型转换,您可以告诉编译器您所做的实际上是有意的。
c,otah,没有这么严格的强制转换规则;您可以在任意两种类型之间愉快地强制转换,并且作为程序员,您有责任确保不会因此发生坏事情。
- 我可以隐式地将int强制转换为bool,没有问题。
- "这是因为C++是一种强类型的语言。"C不是!?
- "C++是一种强类型的语言。""强类型"作为一个术语几乎毫无意义。作者通常用它来表示"我喜欢这种语言"。在C++中,只有在"扩展"时才允许隐式转换,也就是说,如果新类型可以保存旧类型所能保存的每一个值。"这里的几个问题是:"CAST"是一个显式类型转换;如果是隐式的,它不是一个强制转换。C++允许缩小类型转换,就像C:EDCOX1×2编译没有错误一样。由于阵列的存在,将Derived*转换为Base*是不安全的。C++允许它,C不允许。
- "[在C中]您可以在任意两种类型之间愉快地强制转换"不是真的,例如,您不能转换为结构类型(无论是显式(通过强制转换)还是隐式转换)。
C支持从void*到其他指针类型的隐式强制转换。C++不允许它。
C中不赞成显式转换malloc的返回值的一个原因是,如果当前编译单元中不包括malloc签名,编译器将假定返回类型为int并隐式转换为要分配给结果的指针类型,这将导致编译时警告yo。你会立刻解决的。有了一个明确的演员表,如果你犯了这个错误,将不会发出任何警告。