2

我正在学习 C 编译器中的 8 位 6502 编程 (www.cc65.org)

NES FC 有一个 8 位 6502 处理器和一个 2K RAM。但是,以下 C 编译(到 nes 文件)并在 VirtualNES 模拟器中成功加载。

#include "conio.h"
#include "stdlib.h"

int dump[1000];

void main()
{
    int *a;
    a = (int*)malloc(19222999);
    cputs("Hello, World!");
    a[0] = 1;
    for(;;); // loop forever, never ends
}

为什么这样可以?显然,我在上面的 C 代码中分配了超过 2K 的内存。

4

2 回答 2

6

Segfaults 是现代的一个奇妙的奇迹。它们代表我们的计算机时时刻刻自我诊断自己的错误。

相比之下,在过去,几乎没有办法让计算机“崩溃”,因为计算机会意识到某些地方出了问题,从而导致它做其他事情。在这里,您已将 1 写入内存中的某个位置(很可能会覆盖重要的内容!),然后计算机继续运行。

要点:在旧架构和嵌入式系统中,“不会崩溃”是一个非常低的标准,并不表示一切正常。

于 2013-11-25T15:59:44.727 回答
3

您不检查a. (顺便说一句,你为什么要转换返回值?)

我想是的NULL。因此,对 C 的写访问a[0]不是有效的 C,但它可能(取决于架构)仍然有效 - 并在那里造成严重破坏和破坏。

编译过程按预期工作,因为对于编译器和链接器来说,malloc()它是一个函数,就像其他任何东西一样。错误只发生在运行时。

于 2013-11-25T15:49:50.607 回答