如果用零填充整个 RAM 会发生什么
What happens if one fills whole RAM with zeros
如果运行代码片段,PC 会发生什么情况?
...
for (char* ptr = 0; &*ptr < RAM_SIZE; ++ptr)
{
*ptr = 0;
}
...
实际上,在配备现代操作系统的现代 PC 上,尝试写入内存地址 0 会导致分段错误,并且操作系统会终止程序。
在某些嵌入式硬件或操作系统没有内存保护的 PC 上(例如 MS-DOS),计算机很可能会很快挂起,因为您会覆盖对操作系统重要的内存区域,并且CPU 最终会执行 "random" 机器代码,在大多数情况下,这会以某种方式导致 CPU 成为 "stuck"。要恢复,您可能需要硬重置或 power-off。如果你不那么幸运,你也可能最终破坏你的磁盘内容。
在语言层面上,将 0 赋值给指针等同于将空指针赋值给它。取消引用空指针(即 *ptr = 0;
)是未定义的行为,因此理论上编译器可以为该源代码生成任何可以想象的机器代码(因为它可以证明您在那里有未定义的行为)。所以理论上,当你 运行 那个时,任何事情都可能发生。
如果运行代码片段,PC 会发生什么情况?
...
for (char* ptr = 0; &*ptr < RAM_SIZE; ++ptr)
{
*ptr = 0;
}
...
实际上,在配备现代操作系统的现代 PC 上,尝试写入内存地址 0 会导致分段错误,并且操作系统会终止程序。
在某些嵌入式硬件或操作系统没有内存保护的 PC 上(例如 MS-DOS),计算机很可能会很快挂起,因为您会覆盖对操作系统重要的内存区域,并且CPU 最终会执行 "random" 机器代码,在大多数情况下,这会以某种方式导致 CPU 成为 "stuck"。要恢复,您可能需要硬重置或 power-off。如果你不那么幸运,你也可能最终破坏你的磁盘内容。
在语言层面上,将 0 赋值给指针等同于将空指针赋值给它。取消引用空指针(即 *ptr = 0;
)是未定义的行为,因此理论上编译器可以为该源代码生成任何可以想象的机器代码(因为它可以证明您在那里有未定义的行为)。所以理论上,当你 运行 那个时,任何事情都可能发生。