【问题标题】:How many times this loop will run?这个循环将运行多少次?
【发布时间】:2013-08-05 20:50:09
【问题描述】:

面试问问题:

while(1)
{
void * a = malloc(1024*1024); 
}

此循环将在 2 gb ram 和 8 gb ram 上运行多少次?

我说无限循环是因为即使内存已满,也没有终止条件。 他不同意。我现在不知道。请帮忙。

【问题讨论】:

  • @Nobilis 如果内存已满,malloc() 返回NULL
  • 为什么要投反对票???
  • 好问题在 win 7 系统的 Visual Studio 上运行,它几乎让我的系统崩溃。我的电脑死机了 5 分钟,我不得不硬关机并重新启动才能回到这里 :)。
  • 这是一个非常迟钝的面试问题。它只看你是否是某种巫师。没有人会创建这样的循环。我希望这份工作本身实际上与此相关。坚持相关问题更有意义。
  • @H2CO3:在英格兰南部,我希望听到 nullfull 的发音完全不同;在英格兰北部,我可以相信 null 可以像 full 发音(尽管我没有听说过这样的发音)。 Mac 上的(英国)字典指定 'null |nʌl|'和'full |fʊl|',其中两者发音中的元音标记完全不同。 (美国)字典再次不同:'null |nəl|'与“完整的|fo͝ol|”相比但是这些词在美国和英语中的发音明显不同。

标签: c loops memory


【解决方案1】:

它应该无限期地运行。在大多数平台上,当没有更多可用内存时,malloc() 将返回 0,因此循环将继续运行,而不会更改分配的内存量。 Linux 允许内存过度使用,以便malloc() 调用继续添加到虚拟内存。当malloc() 用于管理内存的数据开始导致问题时,该进程最终可能会被OOM Killer 杀死(这不会是因为您尝试使用分配的内存本身,因为代码不使用它),但问题中并未将 Linux 规定为平台。

【讨论】:

  • OOM 杀手只有在内存真正被使用时才会开始行动。只要我保持分配的内存不被写入,就不会发生任何事情。
  • 嗯,我错了。使用 1 MiB 的 malloc 大小,管理数据变得如此之大,以至于它们最终会填满 64 位系统上的内存。对于 1 GiB malloc 大小,虚拟内存大小变为 107t(根据 top)并且程序无限期运行。
  • @glglgl: 是的——但你可能会达到malloc() 必须写入内存以维护其分配的列表的程度,此时OOM Killer 可能会开始行动。
  • 先生,假设我们不是在谈论 Linux 吗?使用像 turbo c/c++ 这样的旧编译器?
  • @joeyrohan 在那个旧的编译器中,你肯定会在某个时候得到NULL,这使得循环确实无穷无尽。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多