每个人都知道:
realloc
调整现有内存块的大小或将其复制到更大的块calloc
确保内存归零,防止算术溢出,并且通常面向大型数组
为什么C标准没有提供一个像下面这样的函数,将以上两者结合起来?
void *recalloc(void *ptr, size_t num, size_t size);
这对于调整巨大哈希表或自定义内存池的大小不是很有用吗?
通常在C中,标准库的重点是而不是提供一组丰富的酷函数。它提供了一组基本的构建块,您可以从中构建自己的酷功能。
您对recalloc
的建议编写起来微不足道,因此不是标准库应该提供的内容。
其他语言采用了不同的方法:C#和Java拥有超级丰富的库,即使是复杂的任务也变得微不足道。但它们带来了巨大的开销。C具有最小的开销,这有助于使它可移植到各种嵌入式设备。
我想您只对数组的新部分感兴趣:
并不是每个内存分配器都知道您在数组中使用了多少内存。例如,如果我这样做:
char* foo = malloc(1);
foo
现在指向至少一个1字节大的内存块。但是,大多数分配器将分配远远超过1个字节(例如,8,以保持对齐)。
其他分配也可能发生这种情况。内存分配器将根据您的请求分配至少的内存,尽管通常只是多一点。
正是这个"多一点"的部分把事情搞砸了(除了其他因素使事情变得困难之外)。因为我们不知道它是否是有用的记忆。如果它只是填充,而你recalloc
它,而分配器没有将它清零,那么你现在有了"新"内存,其中有一些非零
例如,如果我recalloc
foo
让它指向一个至少2字节大的新缓冲区,该怎么办。那个多余的字节会被清零吗?还是不?应该是这样,但请注意,最初的分配给了我们8个字节,所以are recommission不会分配任何新的内存。就分配器所见,它不需要将任何内存归零(因为没有"新"内存归零)。这可能会导致我们的代码出现严重错误。