2012-05-07 15 views
12

मुझे एक अंतरिक्ष आक्रमणकारियों के खेल के साथ एक बहुत ही अजीब समस्या है जिसमें मैं काम कर रहा हूं।0xC0000005: उल्लंघन उल्लंघन स्थान 0x00000000

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

जब मैं नीचे दिए गए कोड का टुकड़ा में शामिल हैं: मूल रूप से मैं एक पहुँच उल्लंघन त्रुटि मिलती है। डिबगिंग करते समय दृश्य स्टूडियो मुझे "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

के निर्माता के अंदर कोड दिखाएं त्रुटि संदेश से पता चलता है कि यह एक शून्य सूचक है, लेकिन मैं नहीं देख सकता कि यह आपके कोड में कहां होगा। आक्रमणकारक कन्स्ट्रक्टर के अलावा, कृपया हमें दिखाएं कि आक्रमणकारियों की सरणी कहां शुरू की गई है। आक्रमणकारियों की कॉपी कन्स्ट्रक्टर भी दिलचस्प हो सकती है, अगर इसमें कोई है। – Medo42

+0

मैंने अभी कन्स्ट्रक्टर के साथ ओपी अपडेट किया है।@ मेडो, आक्रमणकारक सरणी को वैश्विक चर के रूप में शुरू किया गया था: "आक्रमणकार आक्रमणकारियों [55];" – Milk

उत्तर

10

इस लाइन संदिग्ध लग रहा है:

invaders[i] = inv; 

तुम कभी incrementing रहे i है, तो आप invaders[0] को बताए रहते हैं। यदि यह केवल एक त्रुटि है जिसे आपने उदाहरण के लिए अपना कोड कम करते समय बनाया है, तो जांचें कि आप वास्तविक कोड में i की गणना कैसे करते हैं; आप invaders के आकार से अधिक हो सकते हैं।

यदि आपकी टिप्पणी से पता चलता है, तो आप 55 invaders बना रहे हैं, फिर जांचें कि invaders इस नंबर को संभालने के लिए सही ढंग से प्रारंभ किया गया है।

+0

बहुत बहुत धन्यवाद, वह था: एस – Milk

22

"पहुँच उल्लंघन स्थान 0x00000000 पढ़ने" मतलब है कि आप derefrencing a pointer है कि नहीं किया गया हो प्रारंभिक और इसलिए कचरा मूल्य है। उन कचरे के मूल्य कुछ भी हो सकते हैं, लेकिन आमतौर पर यह 0 होता है और इसलिए आप मेमोरी एड्रेस 0x0 से पढ़ने की कोशिश करते हैं, जो ऑपरेटिंग सिस्टम आपको पहचानने से रोकता है और रोकता है।

जांचें और सुनिश्चित करें कि सरणी invaders[] वह है जो आपको लगता है कि यह होना चाहिए। जिसका अर्थ है कि आप हर पाश यात्रा पर स्थान invaders[] की 0 में एक ही Invader वस्तु रखने रखना -

इसके अलावा, आप कभी i को अपडेट करने वाले नहीं हैं।

0

अन्य टिप्पणियों में बताए गए अनुसार यहां समस्या यह है कि पॉइंटर को उचित रूप से प्रारंभ किए बिना अपमानजनक किया जा रहा है। लिनक्स जैसे ऑपरेटिंग सिस्टम एक प्रक्रिया के वर्चुअल एड्रेस स्पेस से सबसे कम पते (जैसे पहले 32 एमबी: 0x00_0000 -0x200_0000) रखते हैं। ऐसा इसलिए किया जाता है क्योंकि शून्य के गैर-प्रारंभिक पॉइंटर्स को संदर्भित करना एक आम गलती है, जैसे इस मामले में। तो जब इस प्रकार की गलती होती है, तो वास्तव में एक यादृच्छिक चर पढ़ने के बजाय जो पता 0x0 पर होता है (लेकिन स्मृति पता नहीं है कि पॉइंटर का उद्देश्य ठीक से शुरू होने के लिए किया जाएगा), पॉइंटर एक स्मृति पते से बाहर पढ़ेगा प्रक्रिया की वर्चुअल एड्रेस स्पेस। इससे पेज गलती होती है, जिसके परिणामस्वरूप सेगमेंटेशन गलती होती है, और इसे मारने के लिए प्रक्रिया को सिग्नल भेजा जाता है। यही कारण है कि आप पहुंच उल्लंघन त्रुटि प्राप्त कर रहे हैं।

संबंधित मुद्दे