C 释放内存时,不同的图像文件大小会导致分割错误

C 释放内存时,不同的图像文件大小会导致分割错误,c,C,我正在学习如何在OpenGL中添加纹理,出于教育目的,我决定不使用“stb_image.h”之类的库来加载图像,而是为.bmp图像编写自己的库 我使用的图像的尺寸是1920x1080(全高清),文件大小是6.2MB(6220922字节)。加载图像并将其从蓝、绿、红(BGR)转换为红、绿、蓝(RGB)后,我决定释放BGR版本,但在执行此操作时发生了“分割错误(内核转储)” 我尝试的其中一个方法是使用不同的图像,这会导致错误消失。 新的图像分辨率为1280x1920,文件大小为7.4 MB(7372

我正在学习如何在OpenGL中添加纹理,出于教育目的,我决定不使用“stb_image.h”之类的库来加载图像,而是为.bmp图像编写自己的库

我使用的图像的尺寸是1920x1080(全高清),文件大小是6.2MB(6220922字节)。加载图像并将其从蓝、绿、红(BGR)转换为红、绿、蓝(RGB)后,我决定释放BGR版本,但在执行此操作时发生了“分割错误(内核转储)”

我尝试的其中一个方法是使用不同的图像,这会导致错误消失。 新的图像分辨率为1280x1920,文件大小为7.4 MB(7372922字节)

我决定翻转早期图像的尺寸(从1920x1080到1080x1920),然后“分割错误(堆芯转储)”返回

这是C中的相关代码(删除了所有OpenGL和GLFW内容)


问题在于这些线路

data[x+(hight-y)*width].r = input[x+y*width+2];
            
data[x+(hight-y)*width].g = input[x+y*width];

data[x+(hight-y)*width].b = input[x+y*width+1];
y=0
时,
数据的缓冲区超限。这使代码进入未定义的行为状态()

要解决此问题,请将上面显示的三行替换为以下内容

data[x+(hight-y-1)*width].r = input[x+y*width+2];
            
data[x+(hight-y-1)*width].g = input[x+y*width];

data[x+(hight-y-1)*width].b = input[x+y*width+1];

首先,您需要使用调试器来捕获崩溃,并在代码中找到崩溃发生的时间和地点。我还建议使用Valgrind之类的工具来帮助您查找此类问题。此外,还建议使用
RGB
结构的大小,在这种情况下,您没有分配足够的内存。我检查了结构RGB的大小为3字节,没有结构填充。
data[x+(hight-y)*width].r=input[x+y*width+2]
y==0时
写入超过分配的
数据
缓冲区的末尾。
输入
索引看起来也不正确。请注意,“width”和“hight”局部变量应定义为uint32_t(无符号int),而不是int。否则,您可能会面临整数溢出。
data[x+(hight-y)*width].r = input[x+y*width+2];
            
data[x+(hight-y)*width].g = input[x+y*width];

data[x+(hight-y)*width].b = input[x+y*width+1];
data[x+(hight-y-1)*width].r = input[x+y*width+2];
            
data[x+(hight-y-1)*width].g = input[x+y*width];

data[x+(hight-y-1)*width].b = input[x+y*width+1];