Visual c++ 尝试从SDL_曲面获取元素时发生访问冲突

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

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 = 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对我来说就是为什么它可以像那样从对到错。它在给定值的函数中工作,我认为,因为它是全局定义的,所以这不会是一个问题。