【发布时间】:2016-02-17 10:54:38
【问题描述】:
我写了一个小程序来解密一个 OTP 加密的文件。这工作得很好。
但我意识到我在“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 意味着它可以工作,但也可能崩溃,或写入其他文件,或静默继续,或任何其他未定义的操作。 -
fputc(otpCipher[j], f);正在写信给Solution.jpg吗?我不这么认为...... -
@LPs 我认为在 OP 的情况下确实如此。因为
fopen("Solution.jpg", "w");恰好为FILE重用了相同的内存,因为指针f已经引用了。所以f中用于fputc的指针是偶然有效的。 -
你说它“工作”只是因为它碰巧做了你想做的事。如果你想让它做其他事情,它就不会工作。它正在做一些你没有告诉它去做的事情,所以我不会说它正在工作。