我正在学习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更多的内存。
答案 0 :(得分:7)
Segfaults是现代时代奇妙而神奇的恩赐;他们代表我们的计算机自我诊断他们自己的错误,时刻刻刻。
相比之下,相比之下,计算机“崩溃”的方式很少,因为计算机会意识到某些事情出了问题,导致它做了别的事情。在这里,你已经在内存中写了一个1(很可能覆盖了一些重要的东西!),然后计算机继续运行。
外卖:在旧架构和嵌入式系统中,“不崩溃”是一个非常低的清除栏,并不表示事情没问题。
答案 1 :(得分:3)
您不检查a
的值。 (顺便说一句,为什么要投出返回值?)
我想是NULL
。因此,对a[0]
的写访问权限不是有效的C,但它可能(取决于架构)工作 - 并且在那里造成破坏和破坏。
编译过程按预期工作,因为对于编译器和链接器,malloc()
是一个函数。这个错误只发生在运行时。