为什么fopen在没有保存返回指针的情况下工作?

joh*_*262 8 c fopen pointers

我写了一个小程序来解密一个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;
}
Run Code Online (Sandbox Code Playgroud)

joh*_*262 6

我刚刚使用gdb找到答案.

所以,因为我fclose()在打开新文件之前使用,所以释放了之前使用的文件的指针.fopen()每次运行此程序时,都可以再次使用此指针并返回此指针.

所以它的工作原因只是因为我打电话时没有打开其他文件fopen().

这是未定义的行为,可能导致其他问题.在任何情况下都应该避免(我错误地做了).我只想了解为什么这个工作并修复了我的代码.

  • 您正确地诊断了实际行为,但请注意,C标准绝不会宽恕它.调用`fclose(f)`后使用`f`是未定义的行为.称之为`fopen()`返回相同指针的小奇迹,当然不依赖它.另请注意,您还应该检查`fopen`和`fread`的返回值. (4认同)
  • +1用于使用gdb自己探索问题并实现/接受"它恰好工作"并不是一个好的状态. (4认同)