如果nelem或elsize == 0,为什么calloc分配1个字节?

问题描述 投票:1回答:1

我正在开发四个基本内存分配例程mallocrealloccallocfree(与Electric Fence的操作类似)的调试实现,以在不具有此功能的嵌入式系统上调试堆损坏具有运行其他内存调试工具的资源,或者没有运行其他工具的资源(例如,GPC 4.6.3随附的PowerPC的LynxOS 7.0,以及不包含mtrace系列的glibc和libstdc ++的专有实现功能)。

以下是GCC的calloc.c中calloc的源代码。

PTR
calloc (size_t nelem, size_t elsize)
{
  register PTR ptr;  

  if (nelem == 0 || elsize == 0)
    nelem = elsize = 1;

  ptr = malloc (nelem * elsize);
  if (ptr) bzero (ptr, nelem * elsize);

  return ptr;
}

为什么nelemelsize都等于1都等于0

如果我尝试分配大小为0n个块或大小为n0个块,则不会导致0个总字节而不是1个字节的总分配?

c++ c malloc calloc
1个回答
0
投票

是的,这只是错误的代码,这在libiberty / gnulib / etc中并不意外。据我了解,如果malloc为每个调用返回空指针而不是唯一指针,它们已经替换了malloc(0),所以我看不出有什么充分的理由使calloc传递1而不是0传递给malloc此外,传递1会破坏/破坏诸如消毒剂之类的调试工具,这些工具可能会告诉您是否无意中将指针取消了对“零元素数组”的引用。

该代码也非常危险,因为它不检查乘法是否溢出;为此需要任何正确的calloc实现。

© www.soinside.com 2019 - 2024. All rights reserved.