尝试从SDL_Surface获取元素时访问冲突

时间:2013-05-29 04:21:56

标签: visual-c++ sdl

Visual Studio Express 2012的调试器说:

Unhandled exception at 0x00B8147F in PFPJ.exe: 0xC0000005: Access violation 
reading location 0x00000008.

以下是调试器所说的代码部分:

(大家知道,widthheightmain.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_Surface*中获取宽度或高度的其他每个示例都使用此表示法。我不完全了解发生了什么。

我确信我自己的内置文件流有一个输出文件,显示它失败的地方。当它在double for循环中引用宽度/高度时,它在一个不同的函数中失败。 SDL_Surface结构定义为:

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 ++比较陌生,所以任何见解都很有帮助)

1 个答案:

答案 0 :(得分:0)

我觉得这条线路失败了

bmmap = SDL_LoadBMP( file );

当它失败时,它返回NULL(即零)。然后,当您取消引用此零地址以获取宽度(在结构中的某个偏移量 - 我猜它是8个字节)时,您会在内存地址0x00000008处获得访问冲突。

添加一项检查以确保SDL_LoadBMP成功。