16ビットのチャンクでバイナリファイル(ゲームボーイROM)の最初の16キロバイトを16進数で出力する簡単なプログラムを作成しようとしています。しかし、for
ループの間、私のプログラムは必ずsegfaultになりますが、配列内の別の場所では常にsegfaultになります。ここでは、コードです:私は(ゲームボーイは、16ビットのアドレス空間を持っているので)、これは発生しなかった文字の代わりにuint16_t使用するように変更され、実際に、私は宣言が含まれている場合前未使用の配列を定義しないセグメンテーションエラー
#include <stdio.h>
#include <stdint.h>
int main()
{
uint16_t buffer[8000];
FILE* ROM = fopen("rom.gb", "rb");
if (ROM == NULL)
{
printf("Error");
fclose(ROM);
return 1;
}
fread(buffer, sizeof(buffer), 1, ROM);
int i;
for(i = 0; i < sizeof(buffer); ++i)
{
if (buffer[i] < 16)
{
printf("000%x ", buffer[i]);
}
else if (buffer[i] < 256)
{
printf("00%x ", buffer[i]);
}
else if (buffer[i] < 4096)
{
printf("0%x ", buffer[i]);
}
else
{
printf("%x ", buffer[i]);
}
}
fclose(ROM);
return 0;
}
unsigned char buffer2[16000];
最初のバッファの宣言の次に、期待される出力が得られます。だから私の質問は、なぜ使用されていない変数を追加するとsegfaultingからプログラムが停止するのでしょうか?そして、どうすればこのことをやめ、プログラムではまったく使われていない巨大な配列を宣言する必要はありませんか?この行で
ありがとう、これは問題を解決し、ループ中にsegfaultsを取得しなくなりました。 – Xerxes