在这个问题上,有人在评论中建议我不要使用malloc的结果。即,我应该这样做:
int *sieve = malloc(sizeof(*sieve) * length);
而不是:
int *sieve = (int *) malloc(sizeof(*sieve) * length);
为什么会这样?
在这个问题上,有人在评论中建议我不要使用malloc的结果。即,我应该这样做:
int *sieve = malloc(sizeof(*sieve) * length);
而不是:
int *sieve = (int *) malloc(sizeof(*sieve) * length);
为什么会这样?
当前回答
malloc的转换在C中是不必要的,但在C++中是必需的。
C中不需要铸造,因为:
在C的情况下,void*会自动安全地升级为任何其他指针类型。如果您忘记包含<stdlib.h>,它可能会隐藏错误。这可能会导致崩溃。如果指针和整数的大小不同,则通过强制转换隐藏警告,可能会丢失返回地址的位。如果指针的类型在声明时发生了更改,那么可能还需要更改调用和强制转换malloc的所有行。
另一方面,强制转换可能会增加程序的可移植性。即它允许C程序或函数编译为C++。
其他回答
对我来说,这里的结论是,在C语言中使用malloc是完全没有必要的,但是如果你使用了C语言,它不会影响malloc,因为malloc仍然会为你分配你请求的内存空间。另一个原因是人们进行选角的原因或原因之一,这是为了使他们能够用C或C++编译相同的程序。
可能还有其他原因,但几乎可以肯定的是,其他原因迟早会让你陷入严重的麻烦。
尽可能在C语言中编程时最好做的事情是:
通过C编译器编译程序,并打开所有警告-Wall并修复所有错误和警告确保没有声明为auto的变量然后使用带有-Wall和-std=C++11的C++编译器对其进行编译。修复所有错误和警告。现在再次使用C编译器进行编译。您的程序现在应该在没有任何警告的情况下编译,并且包含更少的错误。
这个过程使您可以利用C++严格的类型检查,从而减少错误的数量。特别是,此过程强制您包含stdlib.否则您将得到
malloc未在此范围内声明
并且还强制你使用malloc的结果,否则你会得到
从void*到T的转换无效*
或者你的目标类型是什么。
用C而不是C++编写的唯一好处是
C具有明确规定的ABIC++可能会生成更多代码[异常、RTTI、模板、运行时多态性]
请注意,在理想情况下,当使用C所共有的子集和静态多态特性时,第二个缺点应该消失。
对于那些觉得C++严格规则不方便的人,我们可以使用带有推断类型的C++11特性
auto memblock=static_cast<T*>(malloc(n*sizeof(T))); //Mult may overflow...
你会选演员,因为:
它使您的代码在C和C++之间更具可移植性,正如SO的经验所示,许多程序员声称,当他们真正用C++(或C加本地编译器扩展)编写时,他们是在用C编写。如果不这样做,可能会隐藏一个错误:请注意所有的so示例,它们混淆了何时写入类型*和类型**。它会让你注意不到你没有#包含一个合适的头文件,这一想法让你错过了树的森林。这与说“不要担心你没能让编译器抱怨没有看到原型的事实——讨厌的stdlib.h才是真正需要记住的重要东西!”它强制进行额外的认知交叉检查。它将(所谓的)所需类型放在您对该变量的原始大小所做的算术旁边。我敢打赌,你可以做一个SO研究,表明malloc()错误在有演员时被捕获的速度要快得多。与断言一样,揭示意图的注释可以减少错误。以机器可以检查的方式重复自己的行为通常是一个好主意。事实上,这就是断言,使用强制转换就是断言。断言仍然是我们获得正确代码的最通用技术,因为图灵多年前就提出了这个想法。
不强制强制强制强制转换malloc的结果,因为它返回void*,并且void*可以指向任何数据类型。
习惯于GCC和Clang的人被宠坏了。外面不是很好。
这些年来,我被要求使用的过时的编译器吓坏了。公司和管理者通常采用极端保守的方法来更改编译器,甚至不会测试新的编译器(具有更好的标准遵从性和代码优化)是否能在他们的系统中工作。对于正在工作的开发人员来说,实际情况是,当你在编写代码时,你需要覆盖你的基础,不幸的是,如果你不能控制什么编译器可以应用于你的代码,那么使用mallocs是一个好习惯。
我还建议许多组织应用自己的编码标准,如果定义了编码标准,那么这应该是人们遵循的方法。在缺乏明确指导的情况下,我倾向于选择最有可能在任何地方编译,而不是盲目地遵守某个标准。
根据现行标准,这是不必要的,这一论点是非常有效的。但这一论点忽略了现实世界的现实性。在一个完全由当今标准统治的世界里,我们并没有编码,而是由我喜欢称之为“地方管理的现实领域”的实用性来控制。这比太空时代更加弯曲和扭曲
YMMV。
我倾向于将使用malloc作为防御操作。不漂亮,不完美,但总体安全。(老实说,如果你没有包含stdlib.h,那么你会遇到比强制执行malloc更多的问题!)。