首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我是否施放了malloc的结果?

我是否施放了malloc的结果?
EN

Stack Overflow用户
提问于 2018-08-24 01:52:52
回答 2查看 0关注 0票数 0

在这个问题里,有人认为我应该不会施放 malloc 的结果

代码语言:javascript
复制
int *sieve = malloc(sizeof(int) * length);

而不是:

代码语言:javascript
复制
int *sieve = (int *) malloc(sizeof(int) * length);

为什么会这样呢?

EN

回答 2

Stack Overflow用户

发布于 2018-08-24 09:59:34

在C中,您可以隐式地将空指针转换为任何其他类型的指针,因此不需要强制转换。这里是需要一些原因的去使用某些观察者的建议,这可能会使人产生误解。

票数 0
EN

Stack Overflow用户

发布于 2018-08-24 11:04:55

否;你没有投出结果,因为:

  • 这是不必要的,因为void * 在这种情况下自动且安全地提升到任何其他指针类型。
  • 它增加了代码的混乱,转换不容易读取(特别是如果指针类型是长的)。
  • 它让你重复自己所做的,这通常很糟糕。
  • 如果您忘记包含,它可以隐藏错误<stdlib.h>。这可能会导致崩溃(或更糟的是,导致崩溃,直到方式在后面的代码的一些完全不同的部分)。考虑如果指针和整数的大小不同会发生什么; 然后你通过强制转换隐藏了一个警告,可能会丢失你返回的地址。注意:从C11开始,隐式函数从C中消失,并且这一点不再相关,因为没有自动假设未声明的函数返回int

作为澄清,请注意我说“你不投”,而不是“你不需要投”。在我看来,即使你做对了,这个投掷也是失败的。这样做没有任何好处,但是一堆潜在的风险,包括投掷中表明你不知道风险。

还要注意,正如评论员指出的那样,上面谈到的是直C,而不是C ++。我非常坚信C和C ++是不同的语言。

要进一步添加,您的代码会不必要地重复int可能导致错误的类型信息()。最好取消引用用于存储返回值的指针,将两者“锁定”在一起:

代码语言:javascript
复制
int *sieve = malloc(length * sizeof *sieve);

这也会移动length到前面以增加可见性,并删除多余的括号sizeof; 只有在参数是类型名称时才需要它们。许多人似乎不知道(或忽略)这一点,这使得他们的代码更加冗长。记住:sizeof不是功能!:)

虽然在一些罕见的情况下移动length到前面可能会增加可见性,但是在一般情况下,应该注意将表达式编写为:

代码语言:javascript
复制
int *sieve = malloc(sizeof *sieve * length);

因为sizeof在这种情况下保持第一个,所以确保乘法至少用size_t数学来完成。

比较:malloc(sizeof *sieve * length * width)malloc(length * width * sizeof *sieve)第二个可能会溢出的length * width时间widthlength比较小的类型size_t

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档