2012-05-07 173 views
12

我正在處理一個太空入侵者遊戲的一個非常奇怪的問題。基本上我得到一個訪問衝突錯誤:0xC0000005:訪問衝突讀取位置0x00000000

Unhandled exception at 0x5edad442 (msvcr100d.dll) in SpaceInvaders.exe: 0xC0000005: Access violation reading location 0x00000000.

當我包括下面的代碼段。調試時,visual studio帶我到「strcmp.asm」。請注意,我沒有在我的任何代碼中使用strcmp()。代碼有什麼問題,或者這是一個超出我所包含的範圍的問題?感謝您的幫助

const char* invarray[] = {"invader0.png", "invader1.png", "invader2.png", "invader3.png", "invader4.png"}; 
int i=0; 
//Creates 55 invaders 
for (int y=0; y<250; y+=50){ 
    for (int x=0; x<550;x+=50){ 
     Invader inv(invarray[y/50], x+50, y+550, 15, 15, 1, false, 250); 
     invaders[i] = inv; 
    } 
} 

侵略者的構造函數:

Invader::Invader(const char *pic, int x, int y, int w, int h, bool dir, bool des, int point) : MovingObject(pic, x, y, w, h) , direction(dir), destroyed(des), b(0), points(point){}; 

MovingObject構造

MovingObject::MovingObject(const char *pic, int x, int y, int w, int h):picture(pic), positionX(x), positionY(y), width(w), height(h) {}; 
+1

在Invader的構造函數中顯示代碼 –

+1

錯誤消息表明這是一個空指針解引用,但是我看不到這會在您的代碼中發生。除了入侵者構造函數之外,請告訴我們入侵者數組的初始化位置/方式。 Invader的拷貝構造函數也可能很有趣,如果它有的話。 – Medo42

+0

我剛剛用構造函數更新了OP。@Medo,入侵者數組剛被初始化爲全局變量:「Invader invaders [55];」 – Milk

回答

10

這行看起來可疑:

invaders[i] = inv; 

你永遠遞增i,讓你繼續分配給invaders[0]。如果這只是您將代碼縮減爲示例時發生的錯誤,請檢查您在實際代碼中如何計算i;你可能會超過invaders的大小。

如果根據您的意見建議,您正在創建55 invaders,然後檢查invaders已被正確初始化以處理此號碼。

+0

非常感謝,就是這樣:s – Milk

22

訪問衝突讀取位置00000000」 意味着你derefrencing a pointer尚未初始化並因此具有垃圾值。這些垃圾值可能是任何東西,但通常它是0,因此您嘗試從內存地址0x0讀取,操作系統檢測到並阻止您執行此操作。

檢查並確保數組invaders[]是您認爲應該是。

而且,你似乎並不被不斷更新i - 這意味着你繼續把同Invader對象爲位置的invaders[]0在每次循環迭代。

0

這裏的問題,正如其他評論中所解釋的那樣,指針正在取消引用而沒有正確初始化。像Linux這樣的操作系統在進程的虛擬地址空間中保留最低地址(例如,第一個32MB:0x00_0000 -0x200_0000)。這樣做是因爲取消引用歸零的非初始化指針是一個常見的錯誤,就像在這種情況下一樣。所以當這種類型的錯誤發生時,而不是實際讀取恰好在地址0x0處的隨機變量(而不是實際初始化時指針將用於的存儲器地址),則指針將從存儲器地址該進程的虛擬地址空間。這會導致頁面錯誤,從而導致分段錯誤,並將信號發送到進程以終止它。這就是您遇到訪問違規錯誤的原因。

相關問題