2015-01-05 9 views
5

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からプログラムが停止するのでしょうか?そして、どうすればこのことをやめ、プログラムではまったく使われていない巨大な配列を宣言する必要はありませんか?この行で

答えて

10

for(i = 0; i < sizeof(buffer); ++i) 

sizeof(buffer)あなたは要素の数が

i < (sizeof(buffer)/sizeof(buffer[0]))

+2

ありがとう、これは問題を解決し、ループ中にsegfaultsを取得しなくなりました。 – Xerxes

1

を使用したい場合、私はあなたが使用しているかわからない、バイト単位で配列のサイズですfreadの場合、documentationを見ると、2番目の引数は各要素のサイズですが、バッファ全体のサイズは渡しています。

2番目と3番目の引数を交換する必要があります。使用例については、hereを参照してください。

また、Alter Mannが指摘したように、バッファのサイズをそのタイプのサイズで除算する必要があることにも注意してください。

+1

これはまた役に立ちました、ありがとうございました。私はその行を 'fread(buffer、2(sizeof(buffer)/ sizeof(buffer [0])、ROM);に変更しました。私はそれが機能を悪用していたことを考慮して、正しく働いていても驚いています。 – Xerxes

関連する問題