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