使用Bitmaps和Malloc进行分段错误

时间:2017-02-16 19:26:16

标签: c bitmap

我正在学习C,我的任务是调整24位Bitmaps的大小。到目前为止我做了什么:

- 正确编写的代码,用于复制和更新标题

正确编写的代码,用于垂直调整图像大小

-Padding有效

我现在想让它将调整后的行写入一个Middleman,这样我就可以写f次到outfile,就像这样:

// save scanline
FILE* scanline = malloc(sizeof(bi.biWidth) * sizeof(RGBTRIPLE));

// iterate over infile's scanlines
for (int i = 0, biHeight = (abs(bi.biHeight)/f); i < biHeight; i++)
{

    // iterate over pixels in scanline
    for (int j = 0; j < (bi.biWidth/f); j++)
    {
        // temporary storage
        RGBTRIPLE triple;

        // read RGB triple from infile
        fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

        for(int z = 0; z < f; z++)
        {
           // write RGB triple to outfile
           fwrite(&triple, sizeof(RGBTRIPLE), 1, scanline);                 
        }

    }

    // Add Padding to Outfile
    for (int k = 0; k < padding2; k++)
    {
        fputc(0x00, scanline);
    }

    // skip over padding, if any
    fseek(inptr, padding, SEEK_CUR);

    for(int s = 0; s < f; s++)
    {
        // write RGB triple to outfile
        fwrite(scanline, sizeof(RGBTRIPLE), 1, outptr);
    }

}    

我的问题是(这是使用debuging工具计算出来的),无论何时必须写入扫描线文件,我都会立即得到分段错误。 非常感谢你提前,我试图确保我没有打破社区准则,但如果我失败了,我就会大肆宣传。有一个好的!

1 个答案:

答案 0 :(得分:1)

您的问题很可能与您展示的第一行代码相关

// save scanline
FILE* scanline = malloc(sizeof(bi.biWidth) * sizeof(RGBTRIPLE));

您告诉编译器scanlineFILE*(通常可以从fopen(3)获得)但是您已经为该指针分配了一些未初始化的堆内存。然后,当您将scanline传递到fwrite(3)fputc(3)时,他们会查找FILE信息,告诉它写入的位置,但会找到垃圾。

很难说更多,因为您没有显示biRGBTRIPLE的定义,但您需要确定scanline的正确类型并可能更改{ {1}}和scanline来电中的outptr {1}}

- 编辑 -

关于评论中的后续问题,fwrite是否正确取决于您是希望fputc成为文件还是内存缓冲区。在代码的前半部分,您似乎将其视为文件,但在最后的FILE* scanline = fopen("scanline", "w")循环中,您将其视为内存缓冲区。