在这个问题里,有人认为我应该不会施放 malloc 的结果
int *sieve = malloc(sizeof(int) * length);
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
为什么会这样呢?
发布于 2018-08-24 09:59:34
在C中,您可以隐式地将空指针转换为任何其他类型的指针,因此不需要强制转换。这里是需要一些原因的去使用某些观察者的建议,这可能会使人产生误解。
发布于 2018-08-24 11:04:55
否;你没有投出结果,因为:
void *
在这种情况下自动且安全地提升到任何其他指针类型。<stdlib.h>
。这可能会导致崩溃(或更糟的是,不导致崩溃,直到方式在后面的代码的一些完全不同的部分)。考虑如果指针和整数的大小不同会发生什么; 然后你通过强制转换隐藏了一个警告,可能会丢失你返回的地址。注意:从C11开始,隐式函数从C中消失,并且这一点不再相关,因为没有自动假设未声明的函数返回int
。作为澄清,请注意我说“你不投”,而不是“你不需要投”。在我看来,即使你做对了,这个投掷也是失败的。这样做没有任何好处,但是一堆潜在的风险,包括投掷中表明你不知道风险。
还要注意,正如评论员指出的那样,上面谈到的是直C,而不是C ++。我非常坚信C和C ++是不同的语言。
要进一步添加,您的代码会不必要地重复int
可能导致错误的类型信息()。最好取消引用用于存储返回值的指针,将两者“锁定”在一起:
int *sieve = malloc(length * sizeof *sieve);
这也会移动length
到前面以增加可见性,并删除多余的括号sizeof
; 只有在参数是类型名称时才需要它们。许多人似乎不知道(或忽略)这一点,这使得他们的代码更加冗长。记住:sizeof
不是功能!:)
虽然在一些罕见的情况下移动length
到前面可能会增加可见性,但是在一般情况下,应该注意将表达式编写为:
int *sieve = malloc(sizeof *sieve * length);
因为sizeof
在这种情况下保持第一个,所以确保乘法至少用size_t
数学来完成。
比较:malloc(sizeof *sieve * length * width)
与malloc(length * width * sizeof *sieve)
第二个可能会溢出的length * width
时间width
和length
比较小的类型size_t
。
https://stackoverflow.com/questions/-100006050
复制相似问题