我的c代码给出了未知的分段错误

问题描述 投票:0回答:2

所以我正在做第 4 周的 CS50 练习题。它是关于恢复已删除的 JPEG 文件,因此您输入文件检查 4 个标头(前 3 个相同,第 4 个可能有所不同,但他们给了您一个解决方案)但是该程序给了我一个分段错误,我花了很多时间调试但仍然无法弄清楚。我是新人,非常感谢任何帮助

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef uint8_t BYTE;

int main(int argc, char *argv[])
{
    //check for 2 command-line arguments
    if (argc != 2)
    {
        printf("Input one command-line argument\n");
        return 1;
    }

    FILE *f = fopen(argv[1], "r");

    //the first 4 bytes which are the headers
    BYTE b[4];
    int filecounter = 0;

    //a line to check that I'm still not at the end of the file
    while (fread(&b, sizeof(b), sizeof(b), f) == sizeof(b))
    {
        if (b[0] == 0xff && b[1] == 0xd8 && b[2] == 0xff && (b[3] & 0xf0) == 0xe0)
        {
            filecounter++;

            char filename[10];
            sprintf(filename, "%03i.jpg", filecounter);

            FILE *img = fopen(filename, "w");

            BYTE BLOCK[512];

            //Same checking for end of File
            if (fread(&BLOCK, sizeof(BLOCK), sizeof(BLOCK), f) != sizeof(BLOCK))
            {
                fclose(img);
                fclose(f);
                return 1;
            }

            fwrite(&BLOCK, 512, 512, img);
            fclose(img);
        }
    }

    fclose(f);
    return 0;
}

我尝试对多行代码进行调试,但最终不得不删除大部分程序才能停止出现分段错误,因此我无法真正检查错误在哪里。

c segmentation-fault cs50
2个回答
0
投票

好吧,首先你有一个很大的错误。 在

 while (fread(&b, sizeof(b), sizeof(b), f) == sizeof(b))
中,您在错误的地方使用了
&
。你不应该使用它,你使用的函数是
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
它将获得变量的引用。


0
投票

fread 读取了 4x4 字节,您想要读取 16 字节还是 4 字节?对于文件计数器的某些较大值来说,文件名 10 个字符也可能很小。

© www.soinside.com 2019 - 2024. All rights reserved.