2

C コンパイラ (www.cc65.org) で 8 ビット 6502 のプログラミングを学習しています。

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
}

なぜこれでOKなのですか?明らかに、上記の C コードで 2K を超えるメモリを割り当てています。

4

2 に答える 2

3

の値をチェックしませんa。(ところで、なぜ戻り値をキャストするのですか?)

だと思いますNULL。したがって、への書き込みアクセスa[0]は有効な C ではありませんが、それでも (アーキテクチャによっては) 機能する可能性があり、そこで大混乱と混乱を引き起こす可能性があります。

コンパイル プロセスは期待どおりに機能します。これは、コンパイラとリンカにとって、malloc()が関数であるためです。間違いは実行時にのみ発生します。

于 2013-11-25T15:49:50.607 に答える