为什么这行代码会导致电脑死机呢?在特定于内存的级别上会发生什么?
for(int *p=0; ;*(p++)=0)
;
Run Code Online (Sandbox Code Playgroud)
我已经在 Everything2 上找到了“答案”,但我想要一个具体的技术答案。
这段代码只是简单地将一个整数指针设置为空,然后向它指向的整数写入 0 并递增该指针,永远循环。
空指针没有指向任何东西,因此向其写入 0 是未定义的行为(即标准没有说明应该发生什么)。此外,不允许在数组外部使用指针算术,因此即使只是增量也是未定义的行为。
未定义的行为意味着编译器和库作者根本不需要关心这些情况,并且系统仍然是有效的 C/C++ 实现。如果程序员做了任何被归类为未定义行为的事情,那么无论发生什么都会发生,他/她不能责怪编译器和库作者。进入未定义行为领域的程序员不会期望收到错误消息或崩溃,但如果收到错误消息或崩溃(甚至稍后执行一百万条指令),也不会抱怨。
在空指针表示为零并且不支持内存保护的系统上,这种循环的效果可能是开始擦除所有可寻址内存,直到内存的某些重要部分(例如中断表)损坏或直到代码在代码本身上写零,自我毁灭。在其他具有内存保护的系统(当今最常见的桌面系统)上,执行可能会在第一次写入操作时简单地停止。