2013-05-23 12 views
5

Utilizzo Visual Studio 2010 e nel seguente frammento di codice si verifica un'eccezione nell'istruzione if dopo fseek.Eccezione non gestita in un'istruzione if nel codice C

int load_filenew(char *filename, char **buffer) 
{ 
    int size = 0; 
    FILE *fp = 0; 

    fp = fopen(filename, "rb"); 
    if (!fp) 
    { 
     printf(" fopen failed.\n"); 
     return 1; 
    } 

    fseek(fp, 0, SEEK_END); 
    size = ftell(fp); 
    fseek(fp, 0, SEEK_SET); 

    if (size) 
    { 
     if (*buffer) 
     { 
      free(*buffer); 
     } 
     *buffer = 0; 
     *buffer = (char *)malloc(size + 1); 
     if (!*buffer) 
     { 
      printf(" malloc failed.\n"); 
      fclose(fp); 
      return 3; 
     } 
     memset(*buffer, 0, size + 1); 
     fread(*buffer, size, 1, fp); 
     (*buffer)[size] = '\0'; 
    } 
    else 
    { 
     fclose(fp); 
     return 2; 
    } 
    fclose(fp); 

    return 0; 
} 

Questa funzione viene chiamata più volte nel ricorso, ma in alcuni momenti di eccezione non gestita è lanciato seguente riga durante il caricamento di un file

//exception code 
if (size) 
{ 
    if (*buffer) 

prega di aiutare - quello che potrebbe essere la possibile causa e come risolverlo?

+1

qual è il messaggio di errore? Si prega di postarlo. –

+1

Potete includere come chiamate la funzione - e in particolare, cosa fate per garantire che * buffer == 0 o punti ad un buffer valido quando viene chiamato? La fonte più probabile di errore è 'buffer == NULL', o altrimenti non è un puntatore valido. – Floris

+0

La riga '* buffer = 0;' è superflua. –

risposta

1

non risolvere il tuo problema direttamente, ma:

if (*buffer) 
    { 
     free(*buffer); 
    } 
    *buffer = 0; 
    *buffer = (char *)malloc(size + 1); 

Hai pensato di usare realloc() invece?

p = realloc(*buffer, size + 1); 
    if (p != NULL) 
    { 
     *buffer = p; 
    } 
7

Sembra che buffer sia impostato su NULL o qualche altro puntatore non valido e probabilmente su segofault quando lo si denigra. Potrebbe anche essere la prima chiamata a free se il puntatore non è valido. Idealmente è necessario mostrarci il codice che chiama questa funzione.

Ricordare inoltre che è una cattiva forma chiamare un corrispondente malloc e free in diverse funzioni. A meno che quella funzione abbia un solo scopo, allocare una nuova struttura o liberarne una esistente (in altre parole l'allocazione di qualsiasi risorsa dovrebbe essere fatta nella stessa funzione della deallocazione di quella stessa risorsa. L'unica eccezione è una funzione che compone più allocazioni e deallocazioni complesse).

int load_filenew(char *filename, char **buffer) 
{ 
    int size = 0; 
    FILE *fp = 0; 

    if(buffer == NULL) 
    { 
     return 1; 
    } 

    fp = fopen(filename, "rb"); 
    if (!fp) 
    { 
     printf(" fopen failed.\n"); 
     return 2; 
    } 

    fseek(fp, 0, SEEK_END); 
    size = ftell(fp); 
    fseek(fp, 0, SEEK_SET); 

    if (size) 
    { 
     *buffer = (char *)malloc(size + 1); 
     if (!*buffer) 
     { 
      printf(" malloc failed.\n"); 
      fclose(fp); 
      return 3; 
     } 
     memset(*buffer, 0, size + 1); 
     fread(*buffer, size, 1, fp); 
     (*buffer)[size] = '\0'; 
    } 
    else 
    { 
     fclose(fp); 
     return 3; 
    } 
    fclose(fp); 

    return 0; 
} 
+2

+1 per "In altre parole, l'allocazione di qualsiasi risorsa deve essere eseguita nella stessa funzione di deallocazione di quella stessa risorsa" – abasu

Problemi correlati