【问题标题】:What happens if one fills whole RAM with zeros如果一个用零填充整个 RAM 会发生什么
【发布时间】:2019-06-03 20:23:36
【问题描述】:

如果运行代码 sn-p,PC 会发生什么?

...
for (char* ptr = 0; &*ptr < RAM_SIZE; ++ptr)
{
    *ptr = 0;
}
...

【问题讨论】:

  • 你试过了吗?
  • 抛开语言规则,您应该知道消费者操作系统通过虚拟内存将指针值与实际 RAM 地址分开。
  • 大多数环境不允许您这样做(您的应用将在第一次写入尝试时崩溃/终止)。
  • 在任何现代操作系统上,这段代码都会崩溃而不会破坏任何东西。由于virtual memory,您将无法写入不属于您的进程的内存。
  • 在嵌入式系统中,您可能最终会写入控制硬件设备的寄存器,并且它可能会变得丑陋(也就是未定义的行为)。您可以写入没有分配任何内存(读或读/写)的位置,从而导致数据访问中止。

标签: c++ ram


【解决方案1】:

实际上,在具有现代操作系统的现代 PC 上,尝试写入内存地址 0 会导致分段错误,并且操作系统会终止程序。

在某些嵌入式硬件或带有没有内存保护的操作系统(例如 MS-DOS)的 PC 上,计算机很可能会很快挂起,因为您将覆盖对操作系统很重要的内存区域,而 CPU 最终会执行“随机”机器代码,在大多数情况下最终会导致 CPU 以某种方式“卡住”。要恢复,您可能需要硬重置或关闭电源。如果您不那么幸运,您还可能最终损坏您的磁盘内容。

在语言级别上,将 0 分配给指针与将空指针分配给它是相同的。取消引用空指针(即*ptr = 0;)是未定义的行为,因此理论上编译器可以为该源代码生成任何可以想象的机器代码(因为它可以证明您在那里有未定义的行为)。所以理论上,当你运行它时,任何事情都可能发生。

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2023-03-25
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2011-06-04
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多