CS50x 恢复适用于 debug50,但在使用 check50 进行测试时超时

CS50x recover works with debug50 but times out when testing with check50

我目前正在研究 CS50x 恢复问题集 4,我已经完成了编码,并且在使用 debug50 时可以正常工作,但在使用 check50 时它可以正常工作 returns this:

:) recover.c 存在。 :) recover.c 编译。 :) 处理缺少取证图像 :( 正确恢复 000.jpg 等待程序退出时超时 :( 正确恢复中间图像 等待程序退出时超时 :( 正确恢复 049.jpg 等待程序退出时超时

都超时了。

而且我也在控制台中看到了这一点,因为当我 运行 它似乎卡在开头时。 这是我的代码:

#include <stdlib.h>

int main(int argc, char *argv[])
{
    //check for wrong syntax
    if (argc != 2)
    {
        printf("Usage: ./recover image\n");
        return 1;
    }

    //open card
    FILE *file = fopen(argv[1], "r");
    //check if file exists
    if (file != NULL)
    {
        //vars
        unsigned char buffer[512];
        int files = 0;
        FILE *jpg;

        //read file until end
        while (fread(buffer, 512, 1, file) == 1)
        {
            //check for jpg beginning
            if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
            {
                //vars
                char jpgname[8];
                //generate name
                sprintf(jpgname, "%03i.jpg", files);
                //do only if jpg exists
                if (jpg != NULL)
                {
                    fclose(jpg);
                }
                //create new file with generated name
                jpg = fopen(jpgname, "w");
                //increment file counter
                files++;
            }
            //only do when jpg exists
            if (jpg != NULL)
            {
                //write data to file
                fwrite(buffer, 512, 1, jpg);
            }
        }
        if (jpg != NULL)
        {
            //close final jpg
            fclose(jpg);
        }
        //close file finally
        fclose(file);
    }
    else
    {
        //when file not found
        printf("File not found\n");
        return 1;
    }
} ```

如果我是 valgrind,我会抱怨这些 if (jpg != NULL) “条件跳转或移动取决于单元化值”。 FILE *jpg; 声明了文件指针,但没有对其进行初始化。

这将导致“不可预测的结果”,这正是您所描述的。结果将取决于分配给 jpg 的内存以及当程序为 运行 时该内存包含的内容。当 运行 和 debug50 时,内存很可能 NULL。不是这样 check50.