CS-50 pset4恢复:为什么会出现分段错误?

时间:2018-02-05 14:51:14

标签: c cs50

这是CS50-pset4恢复的解决方案。但为什么我得到分段错误? 我试图不访问任何未初始化文件的任何NULL指针,但无法找到出路。 目的是将512B内存块从给定文件复制到另一个文件,如果它匹配作为jpeg文件的条件。并且假设jpeg文件存储在连续的存储器位置中。 $

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

int main(int argc, char *argv[])
{
    // ensure proper usage
    if (argc != 2)
    {
        fprintf(stderr, "Usage: copy infile outfile\n");
        return 1;
    }

    // remember filename
    char *infile = argv[1];
    // open input file
    FILE *inptr = fopen(infile, "r");
    if (inptr == NULL)
    {
        fprintf(stderr, "Could not open %s.\n", infile);
        return 2;
    }
    FILE *img = NULL;
    unsigned char buffer[512] = {0};
    //char *jpgname = NULL;
    string jpegname = "";
    int jpegnum = 0;       // for keep track of jpeg no. 
    //sprintf(jpgname, "%03d.jpg", jpegnum+1);
    //jpegnum += 1;
    while (fread(buffer, 512, 1, inptr) == 1)
    {
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && 
((buffer[3] & 0xf0) == 0xe0))
        {
            if (jpegnum > 0)  // if there exist a jpeg file, it should close first
            {
                fclose(img);
           }
            sprintf(jpegname, "%03d.jpg", (jpegnum+1));
            jpegnum += 1;
            img = fopen(jpegname, "w");
            //fwrite(buffer, 512, 1, img);
        }
       else if (jpegnum == 0)
       {
            continue;
        }
        fwrite(buffer, 512, 1, img);
    }
    fclose(img);
    fclose(inptr);

    return 0;
}

$

1 个答案:

答案 0 :(得分:1)

字符串文字""已分配给jpegname,并传递给sprintf()。 这很糟糕,因为

  • 禁止修改字符串文字。
  • 即使允许修改,""只有1个元素(对于终止空字符),它也不足以保存文件名。

尝试使用

char jpegname[512] = "";

而不是

string jpegname = "";

此更改将为jpegname提供可修改的512字节缓冲区,这对于文件名就足够了。

另请注意,将img的值NULL传递给fclose()应该是错误的。