2010-11-02 23 views
7

यदि आप किसी लिंक की गई सूची में पॉइंटर्स में से किसी एक को दूषित कर दिया गया है या नहीं, तो आप कैसे पाएंगे?एक लिंक्ड सूची में भ्रष्ट सूचक

+0

पाठ्यक्रम के डीबगर के साथ। हार्डवेयर अपवाद भी मदद करता है। –

+0

यह होमवर्क? या क्या आपको कुछ ऐसा करने की ज़रूरत है जो आप स्वयं कर रहे हैं? – wheaties

+3

भ्रष्ट से आपका क्या मतलब है?यदि यह सूची में अगले तत्व को इंगित नहीं कर रहा है, तो बताने का कोई आसान तरीका नहीं है। –

उत्तर

1

यह दर्द का प्रकार है, लेकिन आप प्रत्येक पॉइंटर के मान रिकॉर्ड कर सकते हैं जैसे आप अपने डीबगर के साथ आते हैं और यह सत्यापित करते हैं कि यह उस चीज़ के अनुरूप है जिसे आप ढूंढने की उम्मीद करेंगे (यदि आप एक सूचक होने की उम्मीद करेंगे कुल, सुनिश्चित करें कि यह शून्य है। यदि आप एक सूचक को पहले से मौजूद किसी वस्तु को संदर्भित करने की अपेक्षा करेंगे, तो सत्यापित करें कि उस ऑब्जेक्ट के पते में वह मान है, आदि)।

9

अपने नोड संरचनाओं में एक जादू मूल्य का परिचय दें। इसे नए नोड आवंटन पर शुरू करें। प्रत्येक पहुंच से पहले, जांचें कि क्या नोड संरचना है जो पॉइंटर पॉइंट्स में वैध जादू है। यदि सूचक एक अपठनीय डेटा ब्लॉक पर इंगित करता है, तो आपका प्रोग्राम क्रैश हो जाएगा। इसके लिए, विंडोज़ पर एपीआई वर्चुअलQuery() है - पढ़ने से पहले कॉल करें, और सुनिश्चित करें कि पॉइंटर पठनीय डेटा पर इंगित करता है।

+2

'IsBadReadPtr()' को कॉल न करें [IsBadXxxPtr को वास्तव में क्रैशप्रोग्राम यादृच्छिक रूप से कहा जाना चाहिए] (http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx) कारण – Hasturkun

+0

वर्चुअलQuery(), फिर। –

+0

हेक्स में पठनीय जादू मान भी अच्छे हैं क्योंकि वे कोर, डिबगर्स इत्यादि में स्पष्ट हैं, उदा। क्लासिक 0xDEADBEEF – frankc

3

कई संभावनाएं हैं।

यदि सूची दोगुनी जुड़ी हुई है, तो पीछे सूचक पॉइंटर को इंगित करना संभव है कि फ्रंट पॉइंटर पॉइंट क्या है या इसके विपरीत।

यदि आपके पास अपेक्षित स्मृति पते की सीमा के बारे में कुछ विचार है, तो आप जांच सकते हैं। यह विशेष रूप से लिंक की गई सूची के बारे में सच है, प्रत्येक नोड को स्वतंत्र रूप से आवंटित करने के बजाय स्मृति की सीमित संख्या से आवंटित किया जाता है।

यदि नोड्स में उनमें कुछ पहचानने योग्य डेटा है, तो आप सूची को चला सकते हैं और पहचानने योग्य डेटा की जांच कर सकते हैं।

यह मुझे उन प्रश्नों में से एक जैसा दिखता है जहां साक्षात्कारकर्ता को एक स्नैपी उत्तर की उम्मीद नहीं है, बल्कि आपके प्रश्नों का विश्लेषण भी शामिल है।

+0

एक सामान्य सी समाधान के रूप में, मैं कस्टम आवंटक का उपयोग कर मेमोरी एड्रेस बाउंड चेकिंग के साथ जाऊंगा। और निश्चित रूप से, वे अतिरिक्त प्रश्नों की उम्मीद कर रहे थे। – ruslik

1

यूओ एक दोगुनी जुड़ी सूची रख सकता है। फिर आप उस नोड-> बच्चे-> पैरेंट == नोड (हालांकि अगर नोड-> बच्चा भ्रष्ट हो गया है, तो इसका अपवाद पैदा करने का उचित मौका है)

0

कई डिबगर्स/बाउंड-चेकर्स आपके लिए यह करेंगे है, लेकिन इस सवाल का एक सस्ता और त्वरित समाधान एक अतिरिक्त चार [n] क्षेत्र (या अधिक आम तौर पर दो, पहली बार पिछले क्षेत्रों के रूप में अन्य के रूप में शामिल करने के लिए

  • सूची नोड्स के ढांचे में परिवर्तन करने के लिए है संरचना में, इसलिए सूचक भ्रष्टाचार के अलावा सीमा-जांच की इजाजत देता है)।
  • नोड्स बनने पर इन क्षेत्रों को एक छोटी (लेकिन लंबी पर्याप्त ...) निरंतर स्ट्रिंग जैसे "VaL1D-LiST-NODE 1234" के साथ आरंभ करें।
  • जांचें कि इस (इन) फ़ील्ड में पढ़ने वाले मान अपेक्षित पाठ से मेल खाते हैं, प्रत्येक बार जब नोड को संदर्भित किया जाता है, और नोड में ईमानदारी से उपयोग करने से पहले।

जब क्षेत्र (रों) 'मूल्य इस मेल नहीं खाते या तो संकेत है कि है:

  • सूचक अमान्य है किसी और
  • कुछ (यह एक सूची नोड के लिए कभी नहीं बताया) अधिलेखन है नोड संरचना (सूचक "मान्य" है लेकिन यह जो डेटा इंगित करता है वह दूषित हो गया है)।
संबंधित मुद्दे