首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CS50恢复分段故障

CS50恢复分段故障
EN

Stack Overflow用户
提问于 2020-06-02 13:09:40
回答 3查看 429关注 0票数 0

这是从pset4 CS50恢复过来的。编译它时没有错误。当我运行代码时,会出现分段错误。我不明白究竟是什么错误。我已经找到了其他人发布的关于分割错误的问题的解决方案,但是他们似乎并没有解决我的问题。

有人能解释一下哪里出了问题吗我该怎么解决。

代码语言:javascript
复制
#include <stdio.h>
#include <stdint.h>
typedef uint8_t BYTE;

int main(int argc, char *argv[])
{

if (argc != 2)
{
    printf("Usage: ./recover image\n");
    return 1;
}

FILE *inFile = fopen(argv[1], "r");
if(!inFile)
{
    printf("Could not open file!\n");
    return 1;
}

BYTE buffer[512];
FILE *outFile = NULL;
int imageNum = 0;
char fileName[8];

while (!feof(inFile))
{
     fread(buffer, 1, sizeof(buffer), inFile);
     if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[4] & 0xf0) == 0xef0)
     {
         if (imageNum > 0)
         {
            fclose(outFile);
         }
         imageNum++;
         sprintf(fileName, "%03i.jpg", imageNum);
         outFile = fopen(fileName, "w");
     }
    if (outFile != NULL)
    {
        fwrite(buffer, 1, sizeof(buffer), outFile);
    }
}
fclose(outFile);
fclose(inFile);
return 0;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-04 08:17:27

通过更改这些代码行,我找到了上述问题的解决方案。

代码语言:javascript
复制
while (!feof(inFile)) 

代码语言:javascript
复制
while (fread(buffer, sizeof(buffer), 1, inFile))

代码语言:javascript
复制
fread(buffer, 1, sizeof(buffer), inFile);
fwrite(buffer, 1, sizeof(buffer), outFile);

代码语言:javascript
复制
fread(buffer, sizeof(buffer), 1, inFile);
fwrite(buffer, sizeof(buffer), 1, outFile);

此外,主要的问题是我的如果情况,我改变了

代码语言:javascript
复制
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[4] & 0xf0) == 0xef0)

代码语言:javascript
复制
 if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)

最后一次改变

代码语言:javascript
复制
imageNum++;
sprintf(fileName, "%03i.jpg", imageNum);
outFile = fopen(fileName, "w");

代码语言:javascript
复制
sprintf(fileName, "%03i.jpg", imageNum);
outFile = fopen(fileName, "w");
imageNum++;

谢谢大家的建议和帮助。

票数 1
EN

Stack Overflow用户

发布于 2020-06-02 13:29:14

分段错误的原因很可能是这样的声明:

代码语言:javascript
复制
char fileName[8];

对于大于999的文件名,fileName将溢出。

即用于imagenum >= 1000

代码语言:javascript
复制
sprintf(fileName, "%03i.jpg", imageNum);//produces 8 characters + NULL == 9

...will产生缓冲区溢出的"1000.jpg",从而导致分段故障。

使fileName更大是解决办法:

代码语言:javascript
复制
char filename[20];//or larger as needed.

也是

根据fwrite()fread()的定义,以下函数参数被错误放置:

代码语言:javascript
复制
fread(buffer, 1, sizeof(buffer), inFile);
fwrite(buffer, 1, sizeof(buffer), outFile);
               ^        ^

应:

代码语言:javascript
复制
fread(buffer, sizeof(buffer), 1, inFile);
fwrite(buffer, sizeof(buffer), 1, outFile);
                     ^         ^
票数 1
EN

Stack Overflow用户

发布于 2020-06-02 13:28:51

fileName被定义为在char fileName[8];中有8个元素,但是一旦imageNum超过999,sprintf(fileName, "%03i.jpg", imageNum);就会写入8个以上的字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62152774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档