2013-11-25 5 views
9

मैं समझता हूं कि निम्न पंक्ति में हम एक अवैध स्मृति स्थान पर लिखने का प्रयास कर रहे हैं। लेकिन यह वास्तव में एक misaligned सूचक भी है। क्या कोई समझा सकता है कि एक गलत हस्ताक्षर सूचक क्या है और निम्न गलत हस्ताक्षर सूचक कैसे है?एक गलत हस्ताक्षर सूचक क्या है?

*(int*)0xffffffff = 0xbad; 
+2

कुछ आर्किटेक्चर में पॉइंटर्स कुछ सीमाओं पर गिरना चाहिए, * उदा। *, 32-बिट शब्द सीमा, इसलिए उस स्थिति में पॉइंटर के निचले 2 बिट्स शून्य होने की आवश्यकता होगी। – lurker

उत्तर

9

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

सबसे आर्किटेक्चर, पढ़ने या असंरेखित संकेत लेखन पर दंड के कुछ प्रकार भुगतना पड़ता है। कुछ प्रोसेसर पर, ऐसा करने से बस त्रुटि होती है, जो आमतौर पर प्रोग्राम को तुरंत समाप्त कर देती है। दूसरों पर, जैसे कि x86, असाइन किए गए पठन और लिखने कानूनी हैं लेकिन हार्डवेयर की संरचना के तरीके के कारण प्रदर्शन दंड का सामना करना पड़ता है।

आपके कोड में, 0xBAD = 2989 शायद गठबंधन नहीं है, क्योंकि यह सबसे आम शब्द आकारों में से एक नहीं है, और जिस पॉइंटर को आप लिखते हैं वह शायद गठबंधन नहीं है।

आशा है कि इससे मदद मिलती है!

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