我试图读取.bmp文件,修改它的位图值,然后写入另一个.bmp。
据我所知,每个"字符串"像素以零结尾,但问题是当我尝试写入零值时,程序崩溃。
for (j = 0; j < height * mCoeff; j++)
{
for (k = 0; k < width * mCoeff; k++)
{
fwrite(&newBitmap[j][k].red, 1, 1, output);
fwrite(&newBitmap[j][k].green, 1, 1, output);
fwrite(&newBitmap[j][k].blue, 1, 1, output);
}
fwrite(0, 1, 1, output); //crashes here
}
为了使其正确书写,我应该改变什么?
答案 0 :(得分:7)
frwite()
将指针作为其第一个参数。你正在传递0
,它恰好是一个空指针常量 - 所以你的程序取消引用那个空指针并命中断言。
您需要将指针作为第一个参数传递:
char zero = 0;
fwrite(&zero, 1, 1, output);
答案 1 :(得分:3)
fwrite
的第一个参数应该是一个const void*
指针,指向保存到要写入的数据的缓冲区。您正在传递在0
内取消引用的空指针值(fwrite
),从而导致未定义的行为。
你需要一个保持零的正确对象:
char c = 0;
fwrite(&c, 1, 1, output);
答案 2 :(得分:2)
据我所知,每个&#34;字符串&#34;像素的结尾为零
这是不正确的,扫描线是4字节填充。
最后应该有0,1,2或3个填充字节,因此scanlinesize % 4 == 0
答案 3 :(得分:1)
fwrite(0, 1, 1, output);
您正在编写无效(null)指针。尝试将其写为字符:
char stringEnd = 0; //char 0 = \0
fwrite(&stringEnd, 1, 1, output);