无法将TCP套接字加入SDL_NET套接字集,出现内存访问违例错误
解决SDL2_net套接字集访问违例的问题
你遇到的0xC0000005访问违例,核心原因是错误地将赋值操作=当成了比较操作==,导致后续使用了空的套接字集执行操作,触发了内存访问错误。
咱们拆解代码里的问题点:
- 代码中的
if (socketSet = NULL)是赋值逻辑,不是判断相等!它会直接把NULL赋值给socketSet,同时这个表达式的结果是NULL(逻辑假),导致你跳过了错误处理分支,直接拿着空套接字集去执行后续加入套接字的操作——SDLNet的函数试图访问空指针指向的内存,自然就触发了访问违例。 - 另外,
SDLNet_GetError这里少了调用括号,应该写成SDLNet_GetError(),否则你打印的是函数指针,不是实际的错误信息。
修复后的代码示例:
SDL_Init(SDL_INIT_EVERYTHING); SDLNet_Init(); IPaddress serverIP; SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(10); // 用==做相等判断,而不是=赋值 if (socketSet == NULL) { // 调用SDLNet_GetError()获取正确的错误信息 printf("Failed to create the socket set: %s\n", SDLNet_GetError()); } // 后续加入套接字的操作,必须确保socketSet不为空再执行 if (socketSet != NULL) { // 示例:SDLNet_AddSocket(socketSet, your_client_socket); } // 程序结束别忘清理资源 // SDLNet_Quit(); // SDL_Quit();
额外小提醒:
- 你没写完的
SDLNet_ResolveHost调用,要注意参数逻辑:第二个参数传NULL是绑定本地地址,第三个参数需要填写正确的端口号。 - 初始化SDL和SDLNet后,记得在程序退出时调用对应的退出函数做资源清理。
内容的提问来源于stack exchange,提问作者David Guirguis
相关产品推荐
相关产品推荐

