C 中出现分段错误,不知道为什么? [已关闭]

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

我也使用过Valgrind,但仍然找不到错误。恢复图像是CS50问题。

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

typedef uint8_t BYTE;

int main(int argc, char *argv[])
{
    if ( argc != 2)
    {
        printf("Usage : ./recover image\n");
        return 1;
    }
    //Condition to check whether the file opens or not.
    FILE *file = fopen(argv[1], "r");
    int c=0;
    FILE *img;
    char *fileName = malloc(sizeof(char)*10);
    if(fileName == NULL)
    return 1;
        //Below is the dynamic reading of file.
    do
    {
        int *arr = malloc(sizeof(BYTE)*512);
        if(arr == NULL)
        return 1;         
        fread(arr,sizeof(BYTE),512,file);
        if(arr [0] == 0xff && arr[1] == 0xd8 && arr[2] == 0xff && (arr[3] & 0xf0) == 0xe0)
        {
            if(c == 0)
            {
                img = fopen(" 000.jpg","a");// check for w or a
                fwrite(arr,sizeof(BYTE),512,img);
            }
            else 
            {
                fclose(img);
                sprintf(fileName,"%03i.jpg",c);
                img = fopen(fileName,"a");//check for w or a
                fwrite(arr,sizeof(BYTE),512,img);
            }
            c++;
        }
        else 
        {
            if(c!=0)
            {
                img = fopen(fileName,"a");
                fwrite(arr,sizeof(BYTE),512,img);
            }
        }
            free(arr);
    }while(getc(file) != EOF);
    if(img != NULL)
        fclose(file);
    fclose(img);
    free(fileName);
}

screenshot with error message

c computer-science cs50
2个回答
1
投票

你的问题是你的代码很糟糕。你缺少的是错误检查。大多数库函数(如

fopen
malloc
等)都会通过返回值指示是否成功。例如,如果您要打开的文件不存在,
fopen
可能会失败。

请参阅 fopen 文档

成功完成后,fopen()、fdopen() 和 freopen() 返回 文件指针。否则,返回 NULL 并将 errno 设置为 指出错误。

对于代码中的每个库调用,请考虑如果函数失败会发生什么。您需要考虑这种情况。您至少应该做的是打印错误消息并正确退出程序。

例如对于

fopen

*file = fopen(argv[1], "r");
if (file == NULL) {
    fprintf(stderr, "fopen() failed: %s\n", strerror(errno));
    return 1;
}
// ...

0
投票

您在代码中检查过这一点吗?

int *arr = malloc(sizeof(BYTE)*512);

我不明白你在哪里释放它。尝试一下并告诉我,我可以提供帮助

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