2017-10-03 5 views
-1

Ich schrieb diese Funktion eine unsigned char * mit den Daten aus einer beliebigen Datei (mit rb Lesemodus) sieht das so zurück:C-Funktion zum Lesen der Binärdatei funktioniert nicht, wenn sie von einer anderen Funktion verwendet wird.

uchar * get_file_data (char *f_name, luint *len) { 

    // verify file 
    struct stat sBuffer; 
    int iRc; 

    iRc = stat(f_name, &sBuffer); 
    if (iRc != 0) { 
     printf("Failed to get file size\n"); 
     exit(3); 
    } 

    // read file 
    FILE *fp; 
    fp = fopen(f_name, "rb"); 
    if (fp == NULL) { 
     printf("Failed to open file\n"); 
     exit(3); 
    } 

    uchar *buff = (uchar *) malloc(sBuffer.st_size); 
    *len = fread(buff, 1, sBuffer.st_size, fp); 
    fclose(fp); 

    return buff; 

} 

Arten:

typedef unsigned char uchar; 
typedef unsigned long int luint; 

Jetzt funktioniert dies, wenn sie von der Flucht int main() Funktion wie so:

luint *len; 
uchar *dat = get_file_data(argv[2] /* argument congaing filename */, len); 
print_uchar(dat, len); 
free(dat); 

jedoch, wennAufrufvon int main() Ich bekomme eine Segmentation fault (core dumped), obwohl die Verwendung scheinbar gleich ist.

int has_checksum (char *f_name) { 

    luint *p_len; 
    uchar *p_f_data = get_file_data(f_name, p_len); /* this fails */ 

    /* more code, never reached */ 

} 

Wenn ich versuche, mein Programm mit den folgenden main() ausgeführt wird:

int main(int argc, char **argv) { 

    // verifying other arguments (not filename) */ 

    luint *len; 
    uchar *dat = get_file_data(argv[2], len); 
    print_uchar(dat, len); 
    free(dat); 

    has_checksum(argv[2]); 

    return 0; 
} 

ich diese Ausgabe erhalten:

$ ./md5 -add ../<filename> 
<file contents (correct)> 
Segmentation fault (core dumped) 

ich getestet, wenn char *f_name in get_file_data() das gleiche ist jedes Mal (mit printf("%s\n", f_name); sofort bei der Eingabe get_file_data()), und es war.


System:
- VM Ubuntu 17.04 (64-bit) - VirtualBox

+2

Sie sollen 'luint len;' deklarieren und '& len' übergeben - jetzt haben Sie einen nicht initialisierten Zeiger, der auf wer weiß wohin zeigt. –

+0

Mögliches Duplikat von [Absturz oder "Segmentierungsfehler", wenn Daten kopiert/gescannt/gelesen werden zu einem nicht initialisierten Zeiger] (https://stackoverflow.com/questions/37549594/crash-or-segmentierung-fault-when-data-is -copied-scanned-read-to-an-uninitializ) – TylerH

Antwort

0

Sie eine nicht initialisierte Zeiger in beiden Fällen vorbei, aber Sie bekommen "Glück" in main() und es scheint zu funktionieren. Sie müssen die Adresse eines tatsächlichen integer passieren:

luint len; 
uchar *dat = get_file_data(argv[2], &len); 

Sie sehen, wenn Sie luint *len; erklären, Sie einen Zeiger aber nichts erklärt habe es zu zeigen. Es enthält einen nicht initialisierten Wert und kann überall zeigen. Sie können möglicherweise nicht in der Lage sein, an diesen Ort zu schreiben.

+0

Scheint, dass es sein sollte. 3 Leute suchen, um es zu finden und Sie in 3 Minuten oder weniger. Werde das versuchen. Auch dank @Antti Haapala – Otard95

Verwandte Themen