如何解决我要转换 malloc 的结果吗?
int *sieve = (int *) malloc(sizeof(int) * length);
有两个问题。强制转换并且您使用类型而不是变量作为 sizeof 的参数。相反,这样做:
int *sieve = malloc(sizeof *sieve * length);
长版
;你不投射结果,因为:
- 这是不必要的,因为
void *
在这种情况下会自动安全地提升为任何其他指针类型。 - 它增加了代码的混乱,强制转换不是很容易阅读(特别是如果指针类型很长)。
- 它会让你重复自己,这通常是不好的。
- 如果您忘记包含
<stdlib.h>
. 这可能会导致崩溃(或者,更糟糕的是,直到稍后在代码的某些完全不同的部分中才会导致崩溃)。考虑如果指针和整数大小不同会发生什么;那么你通过强制转换隐藏了一个警告,并且可能会丢失你返回的地址。注意:从 C99 开始,隐式函数已从 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
whenwidth
并且length
是比 . 更小的类型size_t
。
解决方法
建议我不应该将结果转换为malloc
. 即,我应该这样做:
int *sieve = malloc(sizeof(int) * length);
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
为什么会这样?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。