OTPで暗号化されたファイルを解読するための小さなプログラムを作成しました。これはうまく動作します。返されたポインタを保存せずにfopenが動作するのはなぜですか?
しかし、 "Solution.jpg"でfopenを呼び出すときに、返されたファイルポインタを保存するのを忘れてしまったことに気付きました。ご覧のとおり、私はファイルポインタfに書いています。私はなぜこのコードが動作しているのだろうかと思っています。
#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'はそれを閉じた後無効です。それ以来、それを他の関数で使用すると、未定義の動作になります。 UBは動作する可能性がありますが、クラッシュしたり、別のファイルに書き込んだり、サイレントモードで続行したり、未定義のアクションを実行する可能性があります。 – kaylum
'fputc(otpCipher [j]、f);' 'Solution.jpg'に書き込んでいますか?私はそうは思わない... – LPs
@LPs私はOPのケースでそうだと思います。 'fopen(" Solution.jpg "、" w ");'はすでに参照されているポインタ 'f'と同じ' FILE'のために同じメモリを再利用するためです。したがって、 'fputc'のために使用される' f'のポインタは偶然に有効です。 – kaylum