gpt4 book ai didi

CS-50 pset4 恢复 : Why getting segmentation fault?

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:49 24 4
gpt4 key购买 nike

这是CS50-pset4 recover的解决方案。但为什么我会出现段错误?我试图不访问任何 NULL 指针 ar 任何未初始化的文件,但无法找到出路。目的是将 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;
}

$

最佳答案

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

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

尝试使用

char jpegname[512] = "";

代替

string jpegname = "";

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

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

关于CS-50 pset4 恢复 : Why getting segmentation fault?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com