【问题标题】:When does malloc() in C return NULL?C 中的 malloc() 何时返回 NULL?
【发布时间】:2020-01-21 22:55:31
【问题描述】:

当堆内存不足或堆超级碎片时,Malloc 会返回 null。

我想知道的是,如果有其他情况 malloc() 返回 NULL?

PS:Under what circumstances can malloc return NULL? 似乎没有回答我的问题

【问题讨论】:

  • 可能当你传递 0 的大小时。
  • 我看到它可能会返回 null 或实际地址(基于其他回答提到的 cmets)
  • 不清楚你的问题是什么。 malloc() 要么返回有效指针,要么返回 NULL。如果它返回 NULL,你的程序需要做一些适当的事情,比如打印错误信息并退出。
  • 有很多很多很多的系统和实现。从链接中,第二个答案说:the very definition of memory exhaustion is malloc not giving you the desired space。没有内存时,Malloc 返回 NULL。您现在可以推理 为什么 没有内存 - 因为它“超级碎片化”或者它太小,或者出于任何其他原因(并且有很多原因),然后指定 malloc 的实现和操作您完全想到的系统。因为现在我认为这个问题太宽泛了。
  • 我明白了,我被否决的原因是内存不足的原因太多了。

标签: c null malloc


【解决方案1】:

C 中的malloc() 什么时候返回NULL

malloc() 在分配所需空间失败时返回一个空指针

这可能是由于:

  1. 机器内存不足(字节不足)
  2. 进程内存不足(操作系统可能会限制每个进程的空间)
  3. 内存句柄不足(分配过多,某些分配器有此限制)
  4. 太碎片化(存在足够的内存,但分配器不能/不想重新组织成一个连续的块)。
  5. 各种原因比如你的流程是not worthy之类的更多。

malloc(0)可能返回一个空指针。 C17/18 增加了一点。

如果请求的空间大小为零,则行为是实现定义的:
要么返回空指针表示错误
或者行为就像大小是某个非零值,除了返回的指针不应用于访问对象。

malloc(0)可能返回一个空指针。 (C17/18 之前)

如果请求的空间大小为零,则行为是实现定义的:
要么返回空指针,
或者行为就像大小是某个非零值,除了返回的指针不应用于访问对象。

C17/18 的 “指示错误” 对我来说意味着 空指针 返回是一个错误,可能是由于上述 5 个原因之一,并且无错误的malloc(0) 不返回空指针

我认为这是一种趋势,即使 n 为 0,p = malloc(n); if (p==NULL) error(); 在错误时始终为真。否则可能编码为 if (p==NULL && n > 0) error();

如果代码想要容忍零分配以将NULL 作为非错误返回,最好形成一个辅助函数来测试n == 0 并返回NULL,而不是调用malloc()


相反,非空指针的返回并不总是意味着这是足够的内存。见Why is malloc not “using up” the memory on my computer?

【讨论】:

  • 对不起这里的 C 新手。什么是内存句柄,第 2 点是什么意思?
  • @leon 考虑一个分配系统,它只允许 1,000,000 个分配(句柄),而不管它们的大小总和。太多的小分配会破坏句柄。内存分配器的细节取决于实现,另一个分配器可能根本没有“句柄”限制。
  • @Leon 操作系统可能会将每个进程/程序限制为最大内存使用量,例如 2 GB,即使有 64 GB 的内存——这也是一个实现细节。 C 确实指定分配器必须如何工作的细节。
  • 我是否正确地说,只有在程序尚未超过最大内存使用量(例如 2 GB)的情况下才允许进行 1,000,000 次分配?
  • @Leon,是的——同样,分配器可能有也可能没有句柄限制。但如果这样做,句柄可能会在内存池为空之前用完。
【解决方案2】:

如果由于某种原因,您请求 malloc 的内存无法分配,或者有时如果您请求 0 内存,它会返回 NULL

Check the documentation

【讨论】:

  • or you ask for 0 memory, it returns null 为 0,它是实现定义的。它可能会为 0 返回 NULL。它可能会返回一个稍后可以传递给 free 的指针。
  • malloc(0) 并不总是返回 null
  • @KamilCuk 不管怎样,指针都可以传给free,只是你只能使用非NULL的那个。
  • 只是为了挑剔,NULL 也是一个指针,以后可以传递给free。 (free(NULL) 被定义为什么都不做。)malloc(0) 是返回一个空指针(可以传递给free)还是一个可以传递给free 的非空指针,由实现定义。跨度>
  • 抱歉,添加了文档中报告的“有时”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2016-05-24
  • 2012-11-18
  • 2021-11-10
  • 2012-02-21
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多