2013-05-29 69 views
0

的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++,所以任何见解是有帮助的)

回答

0

它看起来对我来说,此行是失败

bmmap = SDL_LoadBMP(file); 

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

添加支票以确保SDL_LoadBMP成功。

+0

哦,有趣。我应该如何检查它的工作原理?我以为它只是返回指向SDL_Surface结构体的指针。而且,据我所知,它确实有效。我有一个函数将曲面转换成二维数组,并且我打印数组以确保... [我认为]它可以正常工作。 – user2085722

+0

好吧,只需添加一个测试if(bmmap == NULL)printf(“Error”)'或类似的东西,看看你得到了什么。然后找出为什么'SDL_LoadBMP'失败... –

+0

是的,BMP肯定是正确加载。没有错误。任何想法为什么它挑出这两行作为罪魁祸首?因为在函数内部,宽度和高度都很好,并能够按预期生成图像。 – user2085722