2015-01-05 16 views
5

Sto provando a scrivere un semplice programma per produrre in esadecimale i primi 16 kilobyte di un file binario (Game Boy ROM) in blocchi di 16 bit. Tuttavia durante il ciclo for il mio programma invariabilmente segfault, tuttavia seg segna sempre in un punto diverso dell'array. Ecco il codice:Errore di segmentazione senza definizione di un array non utilizzato

#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; 
} 

Prima ho cambiato ad usare uint16_t al posto di char (dal momento che il Game Boy ha uno spazio di indirizzamento a 16 bit) questo non si è verificato, e infatti se includo la dichiarazione

unsigned char buffer2[16000]; 

accanto alla dichiarazione del primo buffer ottengo l'output previsto. Quindi le mie domande sono, perché aggiungere una variabile inutilizzata per fermare il programma da segfaulting? E come posso evitare di dover fare questo e dichiarare un enorme array che è completamente inutilizzato nel programma?

risposta

10

In questa linea:

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

sizeof(buffer) è la dimensione della matrice in byte, se si desidera che il numero di elementi usa

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

+2

Grazie mille, questo ha risolto il problema e non ho più segfault durante il ciclo. – Xerxes

1

Non sono sicuro che si sta utilizzando fread correttamente, se si guarda allo documentation, il secondo argomento è la dimensione di ciascun elemento, mentre si passa la dimensione dell'intero buffer.

Probabilmente si desidera scambiare il secondo e il terzo argomento, vedere here per esempi di utilizzo.

Inoltre, come sottolineato da Alter Mann, è necessario dividere la dimensione del buffer in base alla dimensione del suo tipo.

+1

Anche questo è stato utile, grazie. Ho cambiato quella riga in 'fread (buffer, 2, (sizeof (buffer)/sizeof (buffer [0])), ROM);' che fornisce lo stesso risultato ma dovrebbe essere più corretto. Sono sorpreso che funzionasse correttamente anche considerando quanto male stavo abusando della funzione. – Xerxes

Problemi correlati