c - Pointer arithmetic when void has unknown size -


Visual Studio C ++ version 9 (और शायद अन्य संस्करण भी), निम्न कोड:

  

int a = sizeof (शून्य); शून्य const * b = static_cast & lt; void const * & gt; ("नमस्ते विश्व"); बी + = 6; C2070: 'शून्य': अवैध आकार के संचालन और त्रुटि C2036: 'कॉन्स्ट व्यर्थ *': अज्ञात आकार

पूर्व>

यह कोड जीसीसी के तहत काम करता है, जो मानता है।

क्या इस सीमा के आसपास कोई रास्ता है, जैसा कि संकेतक अंकन के उद्देश्यों के लिए स्पष्ट रूप से कास्ट करना है? भ्रम ( शून्य * अच्छी तरह से पहचाना जाता है और कच्चे स्मृति के लिए एक विशिष्ट सूचक के रूप में उपयोग किया जाता है।)

अपडेट0

  • कृपया ध्यान दें, मैं अच्छी तरह से हूं मानक के अस्तित्व की जानकारी।
  • मैं कच्चे पॉइंटर अंकगणित करने के लिए चाहता हूं
  • मैं आकार (शून्य) यह दिखाने के लिए कि मैं इस तथ्य के बारे में अच्छी तरह जानता हूं कि यह 1 समस्या का कारण नहीं है।
  • यह उदाहरण प्रदर्शित करने के लिए है कि उत्पन्न करने के लिए क्या आवश्यक है त्रुटियाँ।
  • मुझे पता है कि यह शून्य का उपयोग करने के लिए एक "सामान्य" तरीका नहीं है, लेकिन यह सी है, और ये बातें होती हैं।
  • हाँ, लोगों को निम्न-स्तर पर ऐसा करने की जरूरत है मैं उसके बाद क्यों नहीं हूं, मैं कैसे उसके बाद हूं यदि आप जानना चाहते हैं कि, कुछ कर्नेल स्रोत या आपके मित्रतापूर्ण glibc पर एक नज़र डालें।

अपडेट 1

ऐसा लगता है कि इस प्रश्न ने बहुत भ्रम पैदा कर दिया है । प्रश्न क्यों होने वाला आकार (शून्य) == 1 मानक नहीं है, लेकिन जब ऐसा नहीं है तो क्या करना है।

इसमें उदाहरण के लिए एकल-बाइट पॉइंटर अंकगणितीय किया जाना है, यह पता चला है कि कोटिंग को char * सही उत्तर है, इसलिए नहीं क्योंकि * (शून्य *) का कोई आकार नहीं है , लेकिन क्योंकि मानक वास्तव में गारंटी देता है कि * (char *) हमेशा 1 है इसलिए कच्चे पॉइंटर अंकगणित के प्रयोजनों के लिए जीसीसी विस्तार के साथ चार * का उपयोग हमेशा सही होता है, और शून्य * के साथ संगत होता है।

आगे बिंदु को सुदृढ़ करें, शून्य * पॉइंटर्स के लिए निहित स्मृति के लिए सही विकल्प है, और चार * कच्चे पॉइंटर अंकगणित के लिए डालने के लिए सही प्रकार है

एक संकेतक को बढ़ाना तकनीकी रूप से इसे किसी भी आकार के आकार में बढ़ाना माना जाता है जो इसकी ओर इशारा कर रहा है। शून्य अंक, कुछ भी नहीं है, इसलिए आकार अज्ञात है।

कुछ कंपाइलरों के लिए यह एक अच्छी बात है कि आप शून्य संकेतक बढ़ाएं

कास्टिंग परेशान है, क्योंकि आपको इसे किसी अन्य पॉइंटर पर डालना है, और फिर वापस, या (* (चार *) और voidptr) जैसे अजीब कुछ करें + = 6

व्यक्तिगत तौर पर, मैं इसे केवल गणित के उद्देश्यों के लिए char * के रूप में घोषित करूंगा


Comments