c - 为什么 malloc(0) 在 Windows 中返回一个非空地址?

标签 c memory-management malloc

下面的代码在 Windows 中执行时返回一个地址,尽管我期望它返回 NULL。

int main()
{
   char *ptr = NULL;
   ptr = malloc(0);
   printf("malloc returned = %u\n", ptr);

}

是什么促使了这样的 malloc 实现?这背后有什么原因吗?

因为这是一个 0 字节的内存,所以我没有尝试写入任何数据。但是,这个内存可以用于任何事情吗?

最佳答案

这只是您请求的最小尺寸。由于 Win32 堆中没有零长度 block ,您可以:

void *p = malloc(0);
// ... do some stuff in between...
realloc(p, n);

这应该主要导致重用堆的一个 block (如果你幸运并且新的大小很小)。一个小的机会主义优化(或减速,取决于上下文和血咖啡水平)。

这是一个简化的例子。实际情况可能是一个类在创建时分配缓冲区并允许增长它。如果输入控制起来很烦人,您可以让它进行零大小的缓冲区分配。

关于c - 为什么 malloc(0) 在 Windows 中返回一个非空地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9723030/

相关文章:

c++ - 如何强制始终首先删除给定资源?

c++ - 您可以在同一对象中拥有对成员 std::shared_ptr<variable> 的成员引用吗?

c - 涉及 C free() 的单元测试

c - fscanf 到链接列表

Java BigInteger 内存不足,可能来自长转换

c - 获取lotus note文档UNID

C++ 程序无错退出。如何调试?

c - 指针被释放但 valgrind 说它不是

c - C 中的奇怪错误

c - c中堆栈数据的输入