2013-02-16 16 views
7

मुझे पता है: char * char के लिए एक सूचक है। और int * int के लिए एक सूचक है। तो इसका मतलब है कि स्मृति पतों 32 बिट व्यापक हैंchar का आकार * int * के आकार के समान है?

  1. तो अब लगता है मुझे 32 बिट मशीन पर हूँ,:

    तो, मैं दो बातें निम्न की पुष्टि करना चाहते हैं। इस प्रकार इसका मतलब है कि char * और int * का आकार 32 बिट्स (4 बाइट्स) दोनों है, है ना? भी int * * का आकार int * के आकार के समान है?

  2. मान लीजिए कि मेरे पास है: int * ptr;

इस प्रकार अब कर * ((चार * *) ptr) = 0x154 एक ही रूप में * ((int *) ptr) = 0x514 एक ही है, सही है? (0x514 बस कोई यादृच्छिक स्मृति पता है)

प्लेटफ़ॉर्म: मैं x86 पर हूं।

पीएस .: मुझे पता है कि प्रकार कास्टिंग कोड के लिए सुझाए गए तरीके नहीं है। लेकिन मैं कर्नेल कोडिंग कर रहा हूं, इस प्रकार मुझे टाइप कास्टिंग करना है!

+0

भले ही मानक यह नहीं कहता है, मुझे संदेह है कि पर्यावरण को ढूंढना आसान होगा जहां यह वास्तव में अलग है। – Mysticial

+0

जबकि उनका आकार अभ्यास में समान है, उनकी संरेखण आवश्यकताएं नहीं हैं। – DCoder

+0

यदि आप "कर्नेल कोडिंग" कर रहे हैं, जो कोड पहले से चलने वाले प्लेटफ़ॉर्म की संख्या को सीमित कर देता है। समर्थित ओएस स्पेस के साथ जांचें। –

उत्तर

11

सी पॉइंटर्स में not guaranteed to have the same size हैं। अब हकीकत में अधिकांश कार्यान्वयन पॉइंटर्स एक ही आकार के होंगे, लेकिन यह संकलक का कार्यान्वयन विवरण है।

C Faq से:

वर्ष हिमाचल प्रदेश 3000 श्रृंखला बाइट शब्द पतों के लिए की तुलना में पतों के लिए एक अलग संबोधित करते हुए योजना का उपयोग करता है; ऊपर मशीनों के कई तरह यह इसलिए चार * के लिए अलग अभ्यावेदन और अन्य संकेत

`` स्मृति मॉडल '' उपयोग में पर निर्भर करता है के लिए की तुलना में शून्य * संकेत का उपयोग करता है, 8086-परिवारिक प्रोसेसर (पीसी compatibles) हो सकता है 16-बिट डेटा पॉइंटर्स और 32-बिट फ़ंक्शन पॉइंटर्स का उपयोग करें, या इसके विपरीत।

*((char *)ptr) = 0x154*((int *)ptr) = 0x154 जैसा नहीं है।चूंकि आप सूचक को संदर्भित कर रहे हैं, तो आप पर इंगित स्थान पर char का आकार और int का आकार डेटा लिखेंगे। एक 8 बिट चार और एक 32 बिट पूर्णांक मान लिया जाये, *((char *)ptr) = 0x154ptr और *((int *)ptr) = 0x154 करने के लिए सौंपा ptr करने के लिए सौंपा पते पर शुरू 4 बाइट के लिए 0x0000000154 लिखेंगे स्मृति पते पर 0x154 लिखेंगे।

+0

संक्षिप्त उत्तर लेकिन महान लिंक। मैं आपके उत्तर में सबसे दिलचस्प वाक्य को रेखांकित करने की अनुशंसा करता हूं, उदाहरण के लिए "पुरानी, ​​शब्द-संबोधित प्राइम मशीन भी शब्द पॉइंटर्स (int *) की तुलना में बड़े बाइट पॉइंटर्स (char *) की आवश्यकता के लिए कुख्यात थीं।" –

+0

@ shf301 : मैंने इसे * ((char **) ptr) = 0x154 में संपादित किया। – user1599964

+0

@ user1599964 मुझे लगता है कि आपके उदाहरण में अलग-अलग मान होने के रूप में एक टाइपो था - 'char **' या 'int *' को कास्टिंग करना बहुत अलग चीजें हैं और सीधे तुलनीय नहीं हैं। वे संकेत के विभिन्न स्तर हैं और एक ही चीज़ करने के करीब भी नहीं हैं। – shf301

1

तकनीकी रूप से बोलते हुए, सी मानक केवल उस आकार (char) == 1 की गारंटी देता है, और शेष कार्यान्वयन पर निर्भर करता है। लेकिन आधुनिक x86 आर्किटेक्चर (जैसे इंटेल/एएमडी चिप्स) पर यह काफी अनुमानित है।

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

अभ्यास में, पॉइंटर्स 16-बिट सिस्टम (यदि आप एक पा सकते हैं) पर आकार 2, 32-बिट सिस्टम पर 4 और 64-बिट सिस्टम पर 8 होंगे, लेकिन इसमें कुछ भी प्राप्त नहीं किया जा सकता है दिए गए आकार पर निर्भर

+0

यह तब तक ठीक है जब तक आप 36- या 48-बिट आर्किटेक्चर में भाग लेते हैं [मानकों की समिति को भी माना जाता है] (http://stackoverflow.com/questions/6971886/exotic-architectures-the- standard-committee-cares-about)। –

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