这个循环会运行多少次?

10

面试问答:

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

2 gb8 gb 的内存上,这个循环会运行多少次?

我认为这是无限循环,因为即使内存已满也没有终止条件。但他不同意。我现在束手无策,请帮帮我。


6
如果内存已满,malloc()会返回NULL - user529758
2
好问题。我在Win 7系统上的Visual Studio上运行了它,几乎让我的系统崩溃了。我的电脑冻结了大约5分钟,我不得不强制关机并重新启动才能回到这里 :)。 - Santhosh Pai
6
这是一个非常拐弯抹角的面试问题,它只是想知道你是否是某种巫师。没有人会创造这样的循环。我希望这份工作本身与此相关。坚持提问相关的问题更有意义。 - uchuugaka
@ChristianRau 我不是以英语为母语的人,但据我所知它们的发音非常相似。 - user529758
2
@H2CO3:在英格兰南部,我期望听到“null”和“full”发音有很大不同;在英格兰北部,我可以相信“null”可能会像“full”一样发音(尽管我没有听过这样的发音)。Mac上的(英国)字典指定了“null |nʌl|”和“full |fʊl|”,其中发音中的元音标记在两者之间非常不同。美式字典又是另一种:'null |nəl|' 与 'full |fo͝ol|',但这些单词在美式和英式英语中都明显地发音不同。 - Jonathan Leffler
显示剩余4条评论
1个回答

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

只有在内存真正被使用时,OOM killer 才会开始工作。只要我保持分配的内存未写入,就不应该发生任何事情。 - glglgl
哎呀,我错了。使用1 MiB的malloc大小后,管理数据变得如此庞大,以至于在64位系统上最终会填满内存。使用1 GiB的malloc大小后,虚拟内存大小停留在107t(根据“top”),程序运行时间无限延长。 - glglgl
2
@joeyrohan 在那个旧编译器中,你肯定会在某个时候得到NULL,使得循环变成无限循环。 - glglgl
在32位系统上,我使用1 MiB的分配也会遇到“到了NULL阶段”的情况。很快就会出现。 - glglgl
@JonathanLeffler 指针长度为6字节,即48位。这应该足以支持256 TiB;如果我限制自己小于<7fffffffffff,则为128 TiB。在某些时候,mmap()不再成功,并且使用“常规”堆。在2b8c814d1000(堆的末尾)和3f350c000000(mmap区域的开始)之间存在一个间隙,以及在7f35213e7000(mmap区域的末尾)和7fffaef10000(堆栈的开始)之间也存在一个间隙。显然,在这些内存区域之间的分配目的非常严格。 - glglgl
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接