为什么不能使用for循环更新像素阵列?

时间:2019-04-12 13:30:34

标签: c++ sfml

我正在使用SFML中的Uint8像素数组,并尝试更新所有像素以使其显示为white / 0xFF / 255,但是出于某种原因,使用for循环没有任何作用,我也不知道为什么,逻辑应该很合理。

使用memset()将每个字节设置为0xFF效果很好,但是偶尔在运行时对我抛出EXC_BAD_ACCESS。将数组中单个像素的每个RGBA设置为0xFF效果很好,我在正确位置的屏幕上出现了一个白点。但是使用for循环将每个像素设置为0xFF不会执行任何操作,没有错误,但是没有结果,这没有任何意义。

// Create buffer

sf::Uint8 *buffer = new sf::Uint8[SCREEN_WIDTH*SCREEN_HEIGHT*4];

for(int i; i < SCREEN_WIDTH*SCREEN_HEIGHT*4; i+=4) {
    buffer[i] = 0xFF;
    buffer[i+1] = 0xFF;
    buffer[i+2] = 0xFF;
    buffer[i+3] = 0xFF;
}

从逻辑上讲,这个for循环应该可以完美地工作,但是当我运行该循环时,我有一个黑屏,中间散布着一些绿色的点(正在使用的内存位置有垃圾)。如果有人可以向我解释为什么会发生这种情况以及如何解决它,我将不胜感激!

1 个答案:

答案 0 :(得分:2)

for(int i; i < SCREEN_WIDTH*SCREEN_HEIGHT*4; i+=4) { 

您从未在此处设置i的初始值,因此它将具有一些不确定的值,实际上,它可能足够大而根本不会循环。默认情况下,c和c ++不会初始化本地基本类型,必须设置一个值。

for(int i = 0; i < SCREEN_WIDTH*SCREEN_HEIGHT*4; i+=4) { 

对于EXC_BAD_ACCESS,您必须将错误的内存地址或大小传递给memset。也许是另一个未初始化的变量?

在C / C ++中,访问对象外部的内存通常没有捕获错误的功能(与许多其他语言一样,该语言将对每个数组的访问进行范围检查以给出IndexOutOfRangeException),并且它只会覆盖一些随机字节,如果您很幸运,那是一个完全无效的内存位置,并且操作系统/处理器会引发错误。