我正在C编译器中学习8位6502的编程(www.cc65.org)
NES FC有8bit 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更多的内存。
发布于 2013-11-25 15:49:50
您不检查a的值。(顺便问一句,你为什么要抛出返回值?)
我想是NULL吧。因此,对a[0]的写访问是无效的C,但是它可能(取决于体系结构)仍然有效-并在那里造成破坏和中断。
编译过程按预期工作,因为对于编译器和链接器来说,malloc()与其他函数一样是一个函数。错误只发生在运行时。
发布于 2013-11-25 15:59:44
分段故障是现代神奇的福音;它们代表着我们的计算机,实时地自我诊断自己的错误。
相比之下,在过去,很少有办法让计算机“崩溃”,也就是说,计算机会意识到某些东西出了问题,而导致它做了其他的事情。在这里,您已经将1写到内存中的某个地方(很可能覆盖了一些重要的东西!),然后计算机继续运行。
需要注意的是:在旧的架构和嵌入式系统中,“不崩溃”是一个很低的清除栏,并不表示一切正常。
https://stackoverflow.com/questions/20197215
复制相似问题