Visual c++ 尝试从SDL_曲面获取元素时发生访问冲突
Visual Studio Express 2012的调试器显示:Visual c++ 尝试从SDL_曲面获取元素时发生访问冲突,visual-c++,sdl,Visual C++,Sdl,Visual Studio Express 2012的调试器显示: Unhandled exception at 0x00B8147F in PFPJ.exe: 0xC0000005: Access violation reading location 0x00000008. 以下是调试器指出问题所在的代码部分: (正如您所知,width和height在main.cpp中全局声明。使用这些变量的所有函数都在main.cpp中 SDL_Surface* bmmap = NULL; bmmap
Unhandled exception at 0x00B8147F in PFPJ.exe: 0xC0000005: Access violation
reading location 0x00000008.
以下是调试器指出问题所在的代码部分:
(正如您所知,width
和height
在main.cpp
中全局声明。使用这些变量的所有函数都在main.cpp
中
SDL_Surface* bmmap = NULL;
bmmap = SDL_LoadBMP( file );
width = bmmap -> w;
height = bmmap -> h;
特别是width=bmmap->w
返回错误
Problem signature:
Problem Event Name: APPCRASH
Application Name: PFPJ.exe
Application Version: 0.0.0.0
Application Timestamp: 51a57a2e
Fault Module Name: PFPJ.exe
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 51a57a2e
Exception Code: c0000005
Exception Offset: 00001838
OS Version: 6.1.7601.2.1.0.256.1
Locale ID: 1033
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
我发现的其他每一个从SDL\u曲面*
中获取宽度或高度的例子都使用这个符号。我不完全理解到底发生了什么
我可以肯定的是,我自己的内置文件流有一个输出文件,显示它失败的位置。当它在双for循环中引用宽度/高度时,它在另一个函数中失败。SDL_曲面结构定义为:
typedef struct SDL_Surface {
Uint32 flags; /* Read-only */
SDL_PixelFormat *format; /* Read-only */
int w, h; /* Read-only */
Uint16 pitch; /* Read-only */
void *pixels; /* Read-write */
SDL_Rect clip_rect; /* Read-only */
int refcount; /* Read-mostly */
} SDL_Surface;
这让我大吃一惊。我不明白这个错误是从哪里来的,也不明白为什么会出现这个问题。它在我使用->
符号的函数的上下文中工作。我发现许多程序使用surface->w
来获取宽度,那么问题出在哪里
(我对C/C++比较陌生,所以任何见解都是有帮助的)在我看来,这一行似乎失败了
bmmap = SDL_LoadBMP( file );
当它失败时,它返回NULL
(即零)。然后,当您取消引用此零地址以获取宽度时(在结构中的某个偏移处-我猜它是8个字节),您会在内存地址0x00000008处获得访问冲突
添加一个检查以确保
SDL\u LoadBMP
已成功。哦,很有趣。我应该如何检查它是否工作?我以为它只返回指向SDL\u曲面结构的指针。而且,据我所知,它确实工作。我有一个函数,可以将曲面转换为二维数组,并打印数组以确保。。。[我认为]它可以正常工作。那么,只要添加一个测试if(bmmap==NULL)printf(“Error”)
或类似内容,看看你得到了什么。然后找出为什么SDL\u LoadBMP
失败……是的,BMP肯定加载正确。没有错误。你知道为什么它会将这两行作为罪魁祸首吗?因为在函数中,宽度和高度都很好,并按预期生成图像。嗯,取消引用指向该结构中的宽度将给出确切的错误,因此这是一个迹象,表明您在某个地方有一个未捕获的空指针。如果它不在您指定的代码行中,那么您可能需要发布实际导致错误的代码,以便我们可以看到可能发生的情况。我想我可能会发布一个指向完整代码的链接。看起来您可能是r指针是正确的。我在使用它的迭代中开始打印x和y的值…它给我的是1000000到5000000范围内的随机数。在这种情况下,迭代依赖于宽度和高度来确定它必须停止的范围。我认为调试器是对的,它必须与该指针相关。pec是什么uliar对我来说就是为什么它可以像那样从对到错。它在给定值的函数中工作,我认为,因为它是全局定义的,所以这不会是一个问题。