c - 为什么 fopen 在不保存返回指针的情况下工作?

标签 c pointers fopen

我写了一个小程序来解密一个 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;
}

最佳答案

我刚刚使用 gdb 找到了答案。

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

所以它起作用只是因为在我调用 fopen() 时没有打开其他文件。

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

关于c - 为什么 fopen 在不保存返回指针的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35454647/

相关文章:

c - 读取 2kb txt 文件时出现段错误 (c)

C double 到指数舍入误差

c - 关于void和指针的问题

C - 拆分降低了我的计算机速度

指向具有指针元素的结构的 C 指针 - 如何分配内存并用作函数输出

c - 如何使用 fopen() 选择打开模式?

c - 寻找带有源代码的嵌入式项目

c - 无法在 Windows 7 中的命名管道内创建进程

c - 有必要将 NULL 转换为结构指针类型以在 C 中进行赋值/比较吗?

PHP 拆分 fwrite 以节省内存