int正意外地回到初始状态

时间:2015-02-28 18:42:50

标签: c

我在这段代码上使用了一个调试器,我的代码中有一个地方意外地改变了int。我在顶部附近声明了jpg = 0。下面大约10行,我将jpg递增1.调试器在这一点上说jpg = 1。如果jpg<它将进入下一行。 10.然后发生一些奇怪的事情。 sprintf函数发生后,jpg现在等于0.为什么?? !!它搞砸了我的其余代码。我无法弄清楚为什么它会在这里将jpg改回0。

谢谢你的帮助,托德


FILE *outptr;

int main(void)
{
    // open input file 
    FILE* image = fopen("card.raw", "r");
    if (image == NULL)
    {
        printf("Could not open, does %s exist?\n", "card.raw");
        return 1;
    }

    // declare a pointer to buffer
    BYTE buffer[512];

    // count the number of JPG files and create JPG filename
    int jpg = 0;
    char filename[7];

    // read 512 bytes of the card
    while (fread(&buffer, 1, 512, image) == 512)
    {
        // check first 4 bytes for JPG header info
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] == 0xe0 || buffer[3] == 0xe1))
        {
            // increment jpg number and jpg filename
            jpg = jpg + 1;

            if (jpg < 10)
            {
                sprintf(filename, "00%d.jpg", jpg);
            }
            else
            {
                sprintf(filename, "0%d.jpg", jpg);
            } 

            // check if this is first JPG, close previous jpg file if not

            if (jpg != 1)
            {
                fclose(outptr);
            }

            // open output file
            FILE* outptr = fopen(filename, "w");
            if (outptr == NULL)
            {
                fclose(image);
                fprintf(stderr, "Could not create %s.\n", filename);
                return 2;
            }

            // write the 512B of buffer info to JPG file
            fwrite(&buffer, 1, 512, outptr);
        } 

        // not the start of a new jpg file, have we reached a jpg yet? 
        else if (jpg != 0)
        {
            // write the 512B of buffer info to JPG file
            fwrite(&buffer, 1, 512, outptr);
        }      
    }

    // close the files
    fclose(image);
    fclose(outptr);
}

1 个答案:

答案 0 :(得分:1)

您有缓冲区溢出filename数组缺少字符串终止符的空格,因此您将八个字符写入七字符数组。这导致undefined behavior