2013-11-25 47 views
2

我學習編程的C編譯器(www.cc65.org)8位NES程序內存限制

的NES FC有8位6502處理器和RAM 2K的8位6502。但是,以下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更多的內存。

+1

[請不要在C]中輸入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。 – unwind

+0

對於記錄,默認的CC65 NES設置/鏈接器腳本依賴於8 kB RAM擴展(基本上是購物車上的額外內存芯片)。否則,您的1000整數數組將無法適合2048字節的RAM作爲運行時還需要其他東西的空間。哦,我強烈建議你在NES上避免這種動態內存分配,否則你會遇到碎片問題。 – doynax

+0

@doynax完整的確認。在嵌入式系統中,最好將'malloc()'的用法限制爲短暫的小內存塊,也可以用於需要「所有剩餘內存」的內存塊,在這裏我計算從內存參數分配的內存量我可以從鏈接器獲得這些分配。 – glglgl

回答

3

您不檢查a的值。 (順便說一句,你爲什麼投出回報值?)

我想它是NULL。因此,對a[0]的寫入訪問權限是無效的,但它可能(取決於體系結構)工作 - 並導致嚴重破壞。

編譯過程按預期工作,因爲對於編譯器和鏈接器,malloc()是一個函數。這個錯誤只發生在運行時。

7

Segfaults是一個奇妙的,現代奇蹟般的恩惠;他們代表我們的電腦自我診斷他們自己的錯誤,每時每刻。相比之下,在計算機上「崩潰」的方式很少,因爲計算機會意識到出了問題,導致它做了其他的事情。在這裏,你寫了一個1到內存中的某個地方(很可能覆蓋重要的東西!),然後計算機繼續。外觀:在舊的體系結構和嵌入式系統中,「不崩潰」是一個非常低的清除條,並不表示事情是好的。

+2

這是一個很好的答案 – alex