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_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 ++比较陌生,所以任何见解都很有帮助)
答案 0 :(得分:0)
我觉得这条线路失败了
bmmap = SDL_LoadBMP( file );
当它失败时,它返回NULL
(即零)。然后,当您取消引用此零地址以获取宽度(在结构中的某个偏移量 - 我猜它是8个字节)时,您会在内存地址0x00000008处获得访问冲突。
添加一项检查以确保SDL_LoadBMP
成功。