gpt4 book ai didi

c - 使用位图和 Malloc 的段错误

转载 作者:行者123 更新时间:2023-11-30 15:00:10 25 4
gpt4 key购买 nike

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

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

-正确编写的垂直调整图像大小的代码

-填充工作

我现在想让它将调整大小的行写入中间人,这样我就可以将他写入输出文件 f 次,如下所示:

// 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);
}

}

我的问题是(这是使用调试工具解决的),每当它必须写入扫描线文件时,我都会立即遇到段错误。提前非常感谢您,我试图确保我没有违反社区准则,但如果我失败了,我会道歉。祝你玩得开心!

最佳答案

您的问题很可能与您显示的第一行代码有关

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

您已告诉编译器 scanline 是一个 FILE*(通常从 fopen(3) 获得),但您却这样做已将一些未初始化的堆内存分配给该指针。然后,当您将 scanline 传递到 fwrite(3)fputc(3) 时,它们将查找 FILE 信息告诉它写到哪里,但会发现垃圾。

很难说更多,因为您没有显示 biRGBTRIPLE 的定义,但您需要确定 scanline< 的正确类型 并可能在 fwritefputc 调用中将 scanline 更改为 outptr

--编辑--

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

关于c - 使用位图和 Malloc 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42282925/

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