मेरे सी कार्यक्रमों में मुझे अक्सर अपने एडीटी का एक स्ट्रिंग प्रतिनिधित्व करने का एक तरीका चाहिए। यहां तक कि अगर मुझे किसी भी तरह से स्क्रीन पर स्ट्रिंग को प्रिंट करने की आवश्यकता नहीं है, तो डिबगिंग के लिए इस तरह की विधि करना साफ-सुथरा है। तो इस तरह का फंक्शन अक्सर सामने आता है।
char * mytype_to_string( const mytype_t *t );
मुझे वास्तव में एहसास होता है कि मेरे पास (कम से कम) तीन विकल्प हैं, जो स्ट्रिंग को वापस करने के लिए मेमोरी को संभालने के लिए हैं।
वैकल्पिक 1: फ़ंक्शन में एक स्थिर चार सरणी में रिटर्न स्ट्रिंग को संग्रहीत करना। मुझे ज्यादा सोच की जरूरत नहीं है, सिवाय इसके कि हर कॉल पर स्ट्रिंग को ओवरराइट किया गया है। जो कुछ अवसरों में एक समस्या हो सकती है।
वैकल्पिक 2: फ़ंक्शन के अंदर मॉलोक के साथ ढेर पर स्ट्रिंग आवंटित करें। वास्तव में स्वच्छ जब से मैं एक बफर या अधिलेखित के आकार के बारे में सोचने की जरूरत नहीं होगी। हालांकि, मुझे स्ट्रिंग को मुफ्त () करने के लिए याद रखना होगा, और फिर मुझे एक अस्थायी चर को भी असाइन करना होगा ताकि मैं मुक्त हो सकूं। और फिर ढेर आवंटन ढेर आवंटन की तुलना में बहुत धीमा है, इसलिए यदि यह एक लूप में दोहराया जाता है, तो एक अड़चन हो।
वैकल्पिक 3: सूचक को एक बफर में पास करें, और कॉलर को उस बफर को आवंटित करने दें। पसंद:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
यह कॉल करने वाले के लिए अधिक प्रयास लाता है। मैं यह भी देखता हूं कि यह विकल्प मुझे तर्कों के क्रम पर एक अन्य विकल्प देता है। मेरे पास कौन सा तर्क होना चाहिए पहला और आखिरी? (वास्तव में छह संभावनाएं)
तो, मुझे कौन सा पसंद करना चाहिए? कोई क्यों? क्या सी डेवलपर्स के बीच किसी प्रकार का अलिखित मानक है?
sysctlbyname
OS X और iOS