Ho scritto un piccolo programma per decodificare un file crittografato OTP. Questo funziona bene.Perché fopen funziona senza salvare il puntatore restituito?
Ma ho capito che ho dimenticato di salvare il puntatore del file restituito quando chiama fopen su "Solution.jpg". Come puoi vedere, sto scrivendo sul puntatore del file f. Mi chiedo perché questo codice funzioni.
#include <stdio.h>
#define FILE_SIZE 4202
int main() {
unsigned char key[FILE_SIZE], otpCipher[FILE_SIZE];
FILE *f = fopen("otpkey.bin", "r");
fread(key, sizeof(char), FILE_SIZE, f);
fclose(f);
f = fopen("otpcipher.bin", "r");
fread(otpCipher, sizeof(char), FILE_SIZE, f);
fclose(f);
fopen("Solution.jpg", "w");
for (int j = 0; j < FILE_SIZE; ++j) {
otpCipher[j] = otpCipher[j]^key[j];
fputc(otpCipher[j], f);
}
fclose(f);
return 0;
}
'f' non è valido dopo la chiusura. Quindi usarlo in qualsiasi altra funzione dopo questo è un comportamento indefinito. UB significa che potrebbe funzionare ma potrebbe anche bloccarsi, o scrivere in qualche altro file, o continuare in silenzio, o qualsiasi altra azione indefinita. – kaylum
È 'fputc (otpCipher [j], f);' scrive in 'Solution.jpg'? Io non la penso così ... – LPs
@LPs Penso che faccia nel caso dell'OP. Perché 'fopen (" Solution.jpg "," w ");' capita di riutilizzare la stessa memoria per quel 'FILE' come il puntatore' f' già fa riferimento. Quindi il puntatore in 'f' usato per quel' fputc' è valido per caso. – kaylum