初始化窗口时SDL2访问冲突错误



我们刚刚开始学习如何使用SDL2,同时遵循教程,我们遇到了这个访问冲突错误。我们正在尝试初始化一个绿色窗口。我们熟悉C和c#,但我们对c++没有太多经验。

在混乱的过程中,我们确定最后四行中的一行似乎包含了问题。我们希望有人能帮忙。

在PWS.exe中0x00007FF801C69BB9 (SDL2.dll)抛出异常:0xC0000005:访问违反写入位置0x00000000000000FF.

#include "SDL.h"
#undef main
int main(int argc, char* argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window* window = SDL_CreateWindow("title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 600, 400, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
SDL_GetRenderDrawColor(renderer, 0, (uint8_t*)255, 0, (uint8_t*)255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_Delay(3000);
return 0;
}

您看到的崩溃来自以下行:

SDL_GetRenderDrawColor(renderer, 0, (uint8_t*)255, 0, (uint8_t*)255);

必须将颜色值强制转换为指针,这一事实立即表明这里有问题。

SDL_GetRenderDrawColor()(注意Get))将渲染颜色的当前值写入作为参数传递的地址,因此您要求SDL将当前颜色的红色和蓝色组件写入0内存地址,并将绿色和alpha组件写入255内存地址。这将导致访问冲突,因为0255不是有效的写入内存地址。

255在64位十六进制中是0x00000000000000FF,这恰好是错误告诉您无效写入位置的错误。这就是为什么我可以如此确信这一行就是罪魁祸首。

注意:SDL可能会跳过对0的写入,因为0表示无处可去是一个常见的约定。

你可能想用SDL_SetRenderDrawColor()代替:

SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);

然而,在您的程序中至少有一个其他主要问题:您没有按照SDL期望的方式设置main()函数。如果您HAVE避免SDL接管main函数,您应该使用SDL_SetMainReady()

最新更新