为什么这行代码导致计算机崩溃?

时间:2014-08-18 01:11:42

标签: c++ c memory

为什么这行代码导致计算机崩溃?特定内存级别会发生什么?

for(int *p=0; ;*(p++)=0)
    ;

我找到了"答案"关于Everything2,但我想要一个特定的技术答案。

3 个答案:

答案 0 :(得分:4)

毫无疑问,问题的原因是p没有被分配合理的地址。

如果在写入指向的位置之前没有正确初始化指针,则可能会执行 Bad Things ™。

它可能只是段错误,或者它可能会覆盖重要的东西,比如函数的返回地址,在该函数尝试返回之前不会发生段错误。


在20世纪80年代,我工作的一位理论家为8086写了一个程序,每秒一次,在随机计算的地址写一个随机数据字。计算机是一个具有看门狗保护和各种输出的过程控制器。问题是:系统在停止有效运行之前会运行多长时间?答案是 小时和小时 !这是一个生动的证明,大部分记忆很少被访问。

答案 1 :(得分:3)

这段代码只是将整数指针正式设置为null,然后将其指向的整数写入0并递增指针,永远循环。

空指针没有指向任何东西,因此向它写0是未定义的行为(即标准没有说明应该发生什么)。此外,您不允许在数组外部使用指针算法,因此即使只是增量也是未定义的行为。

未定义的行为意味着编译器和库作者根本不需要关心这些情况,系统仍然是有效的C / C ++实现。如果程序员做了任何归类为未定义行为的事情,那么无论发生什么事情都会发生,并且他/她不能责怪编译器和库作者。进入未定义行为领域的程序员不能指望错误消息或崩溃,但如果获得一个(甚至一百万个执行指令),则不能抱怨。

在空指针表示为零并且不支持内存保护的系统上,效果或这样的循环可能是开始擦除所有可寻址内存,直到内存的某些重要部分(如中断表)损坏或直到代码在代码本身写入零,自毁。在具有内存保护的其他系统(当今最常见的桌面系统)上,执行可能只是在第一次写入操作时停止。

答案 2 :(得分:1)

可能导致操作系统崩溃,或者它可能会执行任何其他操作。您正在调用未定义的行为。你没有在地址0拥有记忆,而你不会拥有记忆。你只是在不属于你的记忆上受到打击。