为什么我不能使用 for 循环更新像素数组?

Why can't I update an array of pixels using a for loop?

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

使用 memset() 将每个字节设置为 0xFF 效果很好,但在 运行ning 时偶尔会向我抛出 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 循环应该可以完美地工作,但是当我 运行 时,我有一个黑屏,中间散布着一些绿点(正在使用的内存位置的垃圾)。如果有人能向我解释为什么会发生这种情况以及如何解决它,我将不胜感激!

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),它只会覆盖一些随机字节,如果你幸运的话,那可能是一个完全无效的内存位置,OS/processor 会引发错误。