कुछ सी कोड लिखते समय, मुझे एक छोटी सी समस्या आई, जहां मुझे एक चरित्र को "स्ट्रिंग" में परिवर्तित करना पड़ा (कुछ मेमोरी रंक जिसकी शुरुआत char*
पॉइंटर द्वारा दी गई है)।क्या यह (char *) और x कास्ट का व्यवहार अच्छी तरह परिभाषित है?
विचार यह है कि अगर कुछ sourcestr
सूचक सेट किया गया है (नहीं NULL
), तो मैं इसे अपने "अंतिम स्ट्रिंग" के रूप में, का उपयोग करना चाहिए अन्यथा मैं एक सरणी के प्रथम वर्ण में एक दिया charcode
परिवर्तित करना चाहिए, और बजाय इसका इस्तेमाल है ।
इस प्रश्न के प्रयोजनों के लिए, हम मान लेंगे कि चर के प्रकार पहले से नहीं बदला जा सकता है। दूसरे शब्दों में, मैं सिर्फ charcode
को के रूप में int
के बजाय स्टोर नहीं कर सकता।
क्योंकि मैं आलसी हूं, मैंने खुद को सोचा: "अरे, क्या मैं सिर्फ चरित्र के पते का उपयोग नहीं कर सकता और उस सूचक को स्ट्रिंग के रूप में मान सकता हूं?"। यहाँ मैं क्या लिखा का एक छोटा टुकड़ा है (बस अभी तक दीवार के खिलाफ मेरे सिर तोड़ नहीं है!):
int charcode = FOO; /* Assume this is always valid ASCII. */
char* sourcestr = "BAR"; /* Case #1 */
char* sourcestr = NULL; /* Case #2 */
char* finalstr = sourcestr ? sourcestr : (char*)&charcode;
अब निश्चित रूप से मैं इसे करने की कोशिश की है, और जैसा कि मैंने उम्मीद है, यह काम करता है। कुछ चेतावनी झंडे के साथ भी, कंपाइलर अभी भी खुश है। हालांकि, मेरे पास यह अजीब लग रहा है कि यह वास्तव में अपरिभाषित व्यवहार है, और मुझे बस यह नहीं करना चाहिए।
कारण मुझे ऐसा लगता है क्योंकि char*
सरणी को तारों के रूप में ठीक से मुद्रित करने के लिए सरणी को समाप्त करने की आवश्यकता है (और मैं चाहता हूं कि मेरा हो!)। फिर भी, मुझे कोई निश्चितता नहीं है कि &charcode + 1
पर मान शून्य होगा, इसलिए मैं कुछ बफर ओवरफ़्लो पागलपन के साथ समाप्त हो सकता हूं।
क्या कोई वास्तविक कारण है कि यह ठीक से काम क्यों करता है, या मैंने कोशिश की है कि मैं सही जगहों पर शून्यों को पाने के लिए भाग्यशाली रहा हूं?
(ध्यान दें कि मैं अन्य तरीकों से रूपांतरण प्राप्त करने के लिए नहीं देख रहा हूँ। मैं बस एक char tmp[2] = {0}
चर इस्तेमाल कर सकते हैं, और सूचकांक 0. पर मेरे चरित्र डाल मैं भी sprintf
या snprintf
, बशर्ते मैं की तरह कुछ इस्तेमाल कर सकते हैं 'बफर अतिप्रवाह के साथ पर्याप्त सावधान हूँ तरीके यह करने के लिए के असंख्य, मैं सिर्फ इस विशेष डाली आपरेशन के व्यवहार में दिलचस्पी रखता हूँ)
संपादित है:।। मैंने देखा है कुछ लोग इस फोन हैकरी, और चलो स्पष्ट हो: मैं पूरी तरह से आपसे सहमत हूं। मैं रिलीज कोड में वास्तव में ऐसा करने के लिए एक मासोचिस्ट के लिए पर्याप्त नहीं हूं। यह सिर्फ मुझे उत्सुक हो रहा है;)
2 मामले में, यदि आप उस सूचक को स्ट्रिंग के रूप में प्रिंट कर रहे हैं तो नहीं, यह परिभाषित नहीं किया गया है। – 2501
'char *' एक सूचक है। सी में एक स्ट्रिंग प्रकार नहीं है। अच्छे कारणों से कंपाइलर चेतावनी मौजूद है। उन्हें ध्यान देना। – Olaf
अपने आप में और यूबी नहीं है, हालांकि जब आप इसे एक स्ट्रिंग की तरह मानते हैं (जैसे इसे printf या समान रूप से प्रिंट करना) तो यह यूबी – Magisch