पूर्ण लंबाई = 12; Char * filename; चार * कुंजी; फ़ाइल नाम = (चार *) कॉलोक (लंबाई, आकार (चार)); Strcpy (फ़ाइल नाम, "हैलो वर्ल्ड"); // filename = "हैलो वर्ल्ड \ 0"; अब मैं बाएं से 5 अक्षर ट्रिम करना चाहता हूं
key = filename + 6; * (फ़ाइल नाम +5) = 0; नि: शुल्क (फ़ाइल नाम); Printf ("% s \ n", कुंजी); Printf ("% s \ n", फ़ाइल नाम); // कोई विभाजन गलती क्यों ?? मैं इसे मेम्क्पी या स्ट्रक्पी का उपयोग कर प्राप्त कर सकता हूं, लेकिन क्या मैं यह उपरोक्त तरीके से कर सकता हूं?
यह सिर्फ गलत है:
// अभी तक इतनी अच्छी ... फ़ाइल नाम = (चार *) कॉलोक (लंबाई, आकार (चार)); // नहीं!!! आप पहले से आवंटित स्मृति ब्लॉक लीक! // अंत में `\ 0` भी गलत है फ़ाइल नाम = "हैलो वर्ल्ड \ 0"; // यह ठीक है key = filename + 6; // आप एक स्ट्रिंग की स्मृति में लिख रहे हैं, जो कि अपरिभाषित व्यवहार * (फ़ाइल नाम +5) = 0; // आप एक स्ट्रिंग से मुक्त कर रहे हैं, जो कि अपरिभाषित व्यवहार बहुत निःशुल्क है (फ़ाइलनाम); कोई भी सीगफ़ॉल्ट भाग के लिए, अपरिभाषित व्यवहार अभी तक प्रकट नहीं हो सकता है: उदाहरण के लिए, जब आप एक गलत क्षेत्र को मुक्त करते हैं, तो मुक्त हो सकता है, लेकिन बाद में आवंटन विफल हो सकता है। / P>
यदि आप स्ट्रिंग को छोटा करना चाहते हैं, तो एक प्रति बनाएं, और मूल को मुक्त करें:
char * filename = malloc (लंबाई); // कोई कलाकार नहीं strcpy (फ़ाइल नाम, "हैलो, दुनिया"); // no \ 0 char * trimmed = strdup (फ़ाइल नाम + 6); // एक कॉपी मुक्त करें (फ़ाइल नाम); // निशुल्क मूल फ़ाइल नाम = छंटनी; // आप कर चुके हैं! सामान्य तौर पर, आप केवल आपके द्वारा आवंटित किए गए कार्यों को नि: शुल्क कर सकते हैं। इसका मुख्य कारण यह है कि पते के साथ जुड़े स्मृति में malloc / calloc / realloc आपको वापस आ गया है, अक्सर ब्लॉक में अक्सर पहले आवंटित पते पर आप इसे फँसाने की कोशिश कर सकते हैं, लेकिन अगर यह काम करता है, तो समाधान नाजुक और गैर-पोर्टेबल होगा।
No comments:
Post a Comment