2013-05-29 231 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