2012-10-24 11 views
7

क्या क्रॉस प्लेटफ़ॉर्म कोड लिखने के लिए char * का उपयोग करते समय कोई नुकसान होता है जो मेमोरी एक्सेस करता है?क्रॉस प्लेटफार्म कोड लिखते समय शून्य * के बजाय चार * का उपयोग कर कोई नुकसान?

अपडेट: उदाहरण के लिए, यदि मुझे उस प्रकार के आकार के साथ गठबंधन किया गया है, तो मुझे एक निश्चित प्रकार (एक int कहें) पर एक डिफ्रेंस किए गए char * कास्टिंग करने से पहले जांच करनी चाहिए? क्या कुछ आर्किटेक्चर अवांछित पहुंच पर अजीब परिणाम लौटाएंगे?

मैं स्मारक समस्याओं को डीबग करने के तरीके को बेहतर ढंग से समझने के लिए एक प्ले मेमोरी आवंटक पर काम कर रहा हूं। मुझे विश्वास है कि चार * पॉइंटर अंकगणित करने की क्षमता और शून्य से अधिक उन्हें कम करने की क्षमता के कारण बेहतर हैं, क्या यह सच है? निम्नलिखित सामान्य प्लेटफॉर्म पर निम्नलिखित धारणाएं हमेशा सच होती हैं?

sizeof(char) == 1 
sizeof(char*) == sizeof(void*) 
sizeof(char*) == sizeof(size_t) 
+0

जब तक आप 'char' उदाहरणों को संदर्भित नहीं कर रहे हैं, तब तक आपको' char * 'और' void * 'दोनों को जो कुछ भी इंगित करना है, उन्हें डालना होगा। – Aesthete

+0

पता नहीं है कि यह 'गारंटीकृत है' लेकिन मेरे अनुभव में पहला 2 सुरक्षित होना चाहिए। आखरी वाला...??। – vdbuilder

उत्तर

5

sizeof(char)==1 निश्चित रूप से हमेशा सत्य है।

sizeof(char *) == sizeof(void *)शायद हमेशा सत्य भी है। सी मानक के लिए आवश्यक है कि उनके पास समान प्रतिनिधित्व हो, जो कम से कम दृढ़ता से उसी आकार का तात्पर्य है।

sizeof(char *) == sizeof(size_t) निश्चित रूप से इस पर निर्भर नहीं किया जा सकता है - मुझे उन कार्यान्वयनों के बारे में पता है जिनके लिए यह गलत है (और जब वे संभवतः मानक के साथ पूरी तरह अनुरूप नहीं होते हैं, यह उनकी समस्याओं में से एक नहीं है)।

+1

धन्यवाद जैरी। क्या आप एक ऐसे प्रकार को जानते हैं जो हमेशा सूचक आकार के समान आकार होता है (पॉइंटर प्रकार के अलावा :) :)? उदाहरण के लिए यह 32 बिट बिल्ड पर 64 बिट्स और 64 बिट बिल्ड पर 64 होना चाहिए। मैं इंप्रेशन size_t के तहत था इस तरह का एक प्रकार था। – UberMongoose

+1

@UberMongoose: सबसे पहले, ध्यान दें कि यहां तक ​​कि एक आवश्यकता भी नहीं है जो पॉइंटर्स सभी एक ही आकार के हों। वे आमतौर पर होंगे, लेकिन इसकी आवश्यकता नहीं है। अधिकांश सामान्य मामलों में, 'size_t' भी वही होगा, लेकिन फिर से, गारंटी नहीं है (और मुझे कम से कम कुछ अपवादों के बारे में पता है)। एमएस (एक उदाहरण के लिए) कुछ प्रकारों को परिभाषित करता है जैसे INT_PTR (एक पूर्णांक एक सूचक के रूप में एक ही आकार), लेकिन यह सार्वभौमिक से बहुत दूर है। संभवतः आप जो भी कर सकते हैं उसके बारे में कॉन्फ़िगरेशन हेडर में टाइपिफ़ का उपयोग करना है, इसलिए यदि आप किसी ऐसे मंच पर पहुंच जाते हैं जहां आपको आवश्यकता है तो आप संशोधित कर सकते हैं। –

+2

intptr_t? "निम्न प्रकार संपत्ति के साथ एक हस्ताक्षरित पूर्णांक प्रकार निर्दिष्ट करता है कि शून्य के लिए किसी वैध सूचक को इस प्रकार में परिवर्तित किया जा सकता है, फिर पॉइंटर को शून्य में परिवर्तित कर दिया जा सकता है, और परिणाम मूल सूचक के बराबर की तुलना करेगा" – rici

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