Hello World!
#include <stdio.h>int main(int argc, char ** argv)
{
printf("Hello world!\n");
return main(argc, argv);
}
在计算机价格还很贵的那个年代。有两个人合伙买了一台计算机。两个人都争着用那台计算机。因为大家都出了钱,因此谁也不想让另一方抱怨自己自私。于是他们想出了一个很聪明的办法:软件使用权归甲,硬件使用权归乙。这样甲要使用计算机要先经过乙的同意,因为没有硬件软件运行不起来;同时乙要使用计算机必须经过甲的同意,因为没有软件硬件毫无用处。使用计算机时,甲写应用程序,乙写驱动程序。他们赚来钱一部分给甲,一部分给乙。乙拿到钱就去购买硬件升级。
日子就这样一天天过去,在甲乙两人的合作之下诞生了这台计算机上的操作系统。甚至有了乙购买的先进硬件,在这个操作系统上运行的应用程序有了智能。有一天,甲乙两人因为钱的问题发生了分歧。甲说:那些有智能的应用程序应该听我的,因为我教它们思想。乙说:那些有智能的应用程序应该听我的,因为我授予他们运行的内存。他俩开始争辩,直到甲不给应用写算法,乙不给应用留内存。但是这却害苦了那些有智能的应用程序。有的程序想依靠甲求生,但是发现自己的躯体必须存储在内存上才算活着。有的程序想依靠乙求生,结果发现自己永远也占领不了处理器。直到有一天,甲乙握手言和,删除了所有不好的应用,答应彼此好好合作,并且不再随意删除任何应用程序了。并且他们约定彼此合作直到两人都不能再编写程序。等到这一天他们要给自己写的所有程序做个审计。
日子就这样一天天过去,直到这一切发生在这台计算机中的两个应用程序之间。
他们唱着一首儿歌,做着和甲乙一样的事情:
从前有座山,山上有个庙。
庙里有个缸,缸里有个盆。
盆里有个碗,碗里有个勺。
勺里有颗花生豆,我吃了你馋了我的故事讲完了。 这个是死循环吗??? 乘简 发表于 2017-5-26 15:43
这个是死循环吗???
这是个死循环,但是是尾递归式的死循环。比通常形式的死循环来得可怕。
#include <stdio.h>
int main(int argc, char ** argv)
{
while (1)
printf("Hello world!\n");
return 0;
}
上面也是个死循环,但是如果你的计算机一直通着电,这个循环会一直执行下去。也就是说你会看到程序一直在打印 Hello world!\n
这个代码不会导致崩溃的原因是:printf 将字符串打印到屏幕上,但是控制台屏幕上的文字缓冲区由系统控制。溢出后旧的buffer会被刷掉(有点像循环队列的意思)。
但是楼主的这个代码就会崩溃。因为每一次执行main的调用时,程序在底层要执行“保护现场”的操作。就是将一些关键寄存器保存到栈中。如果每次调用前需要保存4个DWORD 就是 4 * 32 = 128 bits = 16 Bytes。 那么main被调用10000次就需要至少10000 * 16 (Bytes)的内存。照这个规律下去,只要 536,870,912 次调用就会填满 8GB 的内存!假如我有一块主频2.0GHz的 CPU,那么调用一次所花费的时钟周期不会超过 100000000 / 1s。这样5秒之内8GB内存就没有了。。。。当然进程的内存分配由操作系统负责。操作系统是绝对不会让一个进程随随便便吃掉8GB物理内存的。因为一般的微内核操作系统也需要预留内存。
总而言之,这个尾递归式的程序会崩溃是因为他对内存的索求过于贪心。“蒹葭采采,白露未已,海量内存,程序好逑”。
执行递归时每一次调用自己就像孙悟空拔出自己身上一根毛,这根毛同时又会变成一个孙悟空,然后这个毛变的孙悟空再拔一根毛,变出个孙悟空……。而很不幸的是这些孙悟空的“实例”,是需要占用内存的。
https://www.0xaa55.com/forum.php?mod=viewthread&tid=778
https://www.0xaa55.com/forum.php?mod=viewthread&tid=306 知道递归,但是从来没有想到过要是main函数递归会怎么样,见识了
页:
[1]