malloc()
स्मृति का एक ब्लॉक आवंटित करेगा और उस स्मृति के लिए सूचक लौट यदि सफल, और यदि असफल शून्य। मेमोरी के ब्लॉक का आकार बाइट्स में malloc
के तर्क द्वारा निर्दिष्ट किया गया है।
sizeof
ऑपरेटर बाइट्स में इसके तर्क का आकार देता है।
char *someString = malloc(sizeof(char) * 50)
यह एक 49 चरित्र स्ट्रिंग के लिए पर्याप्त जगह आवंटित करेगा शून्य चरित्र, और कहा कि स्मृति में बिंदु someString
सहित नहीं (एक सी शैली स्ट्रिंग एक शून्य ('\0'
) चरित्र द्वारा समाप्त किया जाना चाहिए)।
ऐसा लगता है कि आपके प्रश्न में यह कोड malloc(sizeof(char) * 2);
होना चाहिए, क्योंकि sizeof(char) + 2
समझ में नहीं आता है।
नोट करें कि sizeof(char)
हमेशा बराबर 1 (बाइट) की गारंटी है - लेकिन अन्य प्रकारों (जैसे लंबे समय) की स्मृति प्रस्तुति कंपेलरों के बीच भिन्न हो सकती है।
गतिशील रूप से आवंटित स्मृति के साथ आपको भाग्यशाली (अन) भाग्यशाली तरीका है यदि आप आवंटित स्मृति के बाहर पढ़ने/लिखने का प्रयास करते हैं।
उदाहरण के लिए,
char *someString = malloc(10);
strcpy(someString, "Hello there, world!");
printf("%s\n", someString);
पहली पंक्ति 9 पात्रों के लिए पर्याप्त जगह है, और एक शून्य चरित्र आवंटित करता है।
दूसरी पंक्ति उस स्मृति स्थान में 20 वर्ण (1 9 + एनयूएलएल) की प्रतिलिपि बनाने का प्रयास करती है। यह बफर को ओवररन्स करता है और कुछ अविश्वसनीय रूप से विनोदी हो सकता है, जैसे आसन्न स्मृति को ओवरराइट करना, या सीगफॉल्ट का कारण बनना।
तीसरी पंक्ति काम कर सकती है, उदाहरण के लिए अगर कुछ स्ट्रिंग के बगल में स्मृति आवंटित की गई थी, और "हैलो, दुनिया!" उस मेमोरी स्पेस में भाग गया, यह आपकी स्ट्रिंग प्लस प्रिंट कर सकता है जो अगली मेमोरी स्पेस में था। यदि वह दूसरी जगह पूरी तरह से समाप्त हो गई थी, तो यह तब तक रुक जाएगी - जब तक कि यह नहीं था, इस मामले में यह भटक जाएगा और अंत में segfault।
यह उदाहरण एक बहुत ही सरल ऑपरेशन है, फिर भी गलत जाना बहुत आसान है। सी मुश्किल है - सावधान रहें।
आवंटित क्यों सभी तरीकों के लिए पर्याप्त स्थान चूसना? कोई आसान तरीका नहीं है! – Kredns
स्ट्रिंग्स सी का सबसे टूटा हिस्सा हैं। मैं एक छद्म-ओओ 'स्ट्रिंगबिल्डर' संरचना या इसी तरह कोडिंग करने की सलाह देता हूं, और उदाहरण बना रहा हूं। StrBufPrintf, StrBufGets, StrBufScanf, आदि इस तरह के संचालन को केंद्रीकृत करने के लिए। मानक सी लाइब्रेरी ज्यादा मदद नहीं करता है। सी ++ थोड़ा बेहतर है, क्योंकि आपके पास आमतौर पर विभिन्न स्ट्रिंग क्लास के 10 से चुनने के लिए चयन किया जाता है, प्रत्येक एक अलग फ्रेमवर्क के लिए इस्तेमाल किया जा रहा है। हाँ, मैं व्यंग्यात्मक हूँ। –
आसान तरीका है (1) ऐसी भाषा का उपयोग करें जहां एक स्ट्रिंग एक मूल प्रकार है; (2) एक पुस्तकालय का उपयोग करें जो स्ट्रिंग व्यवहार प्रदान करता है; या (3) आप जिस भाषा का उपयोग कर रहे हैं उसे सीखें। यदि आप उपकरण का उपयोग कैसे करना सीखना नहीं चाहते हैं, तो आप भी कोशिश क्यों कर रहे हैं। एक और भाषा खोजें जो आपके लिए अधिक अनुकूल है (मैं यहां अपमानजनक होने की कोशिश नहीं कर रहा हूं, केवल व्यावहारिक)। – paxdiablo