【问题标题】:Malloc equivalent for calloc [duplicate]等效于 calloc 的 Malloc [重复]
【发布时间】:2018-06-12 09:32:44
【问题描述】:

自从我为微控制器编写代码以来,它一直是白纸,我正在尝试用 C 重构一些代码以在这样的设备上工作。

我有一行代码:

Pieces = calloc(ARRAYSIZE, sizeof(struct piece));

http://www.cplusplus.com 声明 calloc:

为一个由 num 个元素组成的数组分配一块内存,每个元素的长度为 size 个字节

那么等效的 malloc 操作会是:

Pieces = Malloc(ARRAYSIZE*sizeof(struct piece));

不管这些位没有被设置为 0,那不是一样吗?还是我必须为 ARRAYSIZE 次分配一块内存?

希望你能帮忙。

【问题讨论】:

  • 是的,malloc 接受一个以字节为单位的大小参数(您是说 stdlib 的 malloc?)
  • 是的 - 就分配而言,您拥有的东西是等效的。但是存在细微的差异(这对您的用例可能很重要,也可能无关紧要)。见:stackoverflow.com/q/1538420/1275169
  • ARRAYSIZE*sizeof(struct piece) 可能会导致无法检测到的溢出。 calloc(ARRAYSIZE, sizeof(struct piece)) 可以检测到太大的产品。

标签: c malloc


【解决方案1】:

使calloc(x,y)malloc(x*y) 不同的事实是(1)前一个分配的大小是xy 的算术乘积,即使该值会超过SIZE_MAX [通常,一个实现会为这样的分配请求返回一个空指针,但如果一个实现能以某种方式满足该请求,标准将允许它这样做]; (2) 存储将被清除,并且可以在没有 UB 的情况下读取,因为所有位为零是合法值的任何类型 [在大多数平台上,所有类型都符合条件,但标准允许所有位为零指针或浮点类型的陷阱值]。

【讨论】:

  • 如果x*y 超过SIZE_MAXmalloc(x*y) 可能很容易满足,因为产品(溢出后)可能非常小。当然当时分配的内存太小了。
  • @chux:这是我注意到 malloc(x*y) 和 calloc(x,y) 之间的行为差​​异之一。长期以来,我一直对标准库倾向于将功能的独立方面进行分组这一事实感到厌烦,例如是否应该缩放分配以及是否应该保证内存被清除,或者 - 作为其他一些不受欢迎的配对,接收输入行的函数是否应该删除换行符以及是否允许调用者设置最大长度,或者函数是否应该将字符串输出到控制台而不是其他内容以及是否添加换行符。
猜你喜欢
  • 2011-07-03
  • 2017-12-06
  • 2012-11-11
  • 2012-10-08
  • 2011-05-13
  • 2011-02-06
  • 2012-03-02
  • 2010-12-05
相关资源
最近更新 更多