Howto check if a char* points to a string literal in C -
मेरे पास एक स्ट्रेट
स्ट्रेट अनुरोध {int code; चार * संदेश; };
कि मैं ठीक से खाली करना चाहता हूं।
मेरे पास ऐसा करने के लिए निम्नलिखित फ़ंक्शन हैं:
शून्य free_request (struct अनुरोध * रिक) {if (req- & gt; संदेश! = NULL) {नि: शुल्क (अनुरोध- & gt; संदेश); } निशुल्क (रिक); रेक = नल; }
समस्या यह है कि जब मैं एक स्ट्रिंग का उपयोग कर बनाया गया अनुरोध को खाली करने का प्रयास करता हूं, तो मुझे "मुक्त (): अवैध पॉइंटर" / सेगफ़ॉल्ट त्रुटि संकलक से मिलता है: < / P>
संरचना अनुरोध * अनुरोध; Req = malloc (आकारफ (संरचना अनुरोध)); Req- & gt; संदेश = "परीक्षण"; free_request (अनुरोध); चूंकि मैं अलग-अलग स्थानों पर अनुरोध स्ट्रैक्ट्स बनाना चाहता हूं, एक बार शाब्दिक (क्लाइंट साइड पर) का उपयोग करने के बाद और एक बार * सॉकेट (सर्वर साइड पर) से पढ़ते हुए * वर्णों का उपयोग करते हुए मैं था सोच रहा था कि क्या यह सुनिश्चित करने के लिए कोई फ़ंक्शन है कि मैं अभी भी लिखित भाषा को मुक्त करने की कोशिश नहीं करता, जबकि मुझे अभी भी एक मॉलोक का उपयोग करके संदेश को मुक्त करने की इजाजत देता है। पोस्ट-पाठ "आइटमप्रॉप =" टेक्स्ट "> कोई मानक फ़ंक्शन नहीं है जो आपको यह बताता है कि कोई संकेतक गतिशील रूप से आवंटित किया गया था या नहीं। आपको अपनी संरचना को सूचित करने के लिए अपने ध्वज को शामिल करना चाहिए, या केवल गतिशील रूप से आवंटित स्ट्रिंग्स का उपयोग करें ( strdup
इस मामले में आपका दोस्त है)। आपके नेटवर्किंग सेटअप के आधार पर, strdup
का उपयोग करना आसान हो सकता है (ठीक है, सच कह, यह है पर strdup
का उपयोग करने के लिए सरल सभी)।
साथ strdup
:
संरचना संदेश * req; Req = malloc (sizeof * req); Req- & gt; संदेश = strdup ("परीक्षण"); free_request (अनुरोध);
एक झंडा के साथ:
स्ट्रेट संदेश {int code; चार * संदेश; बूल वास्तविक है; // 'चार' की जगह अगर bool मौजूद नहीं है}; शून्य नि: शुल्क_रुग्ण (स्ट्रक्चर संदेश * रिक) {if (! Req- & gt; है स्थिर है) मुक्त (पुनः-> संदेश); नि: शुल्क (अनुरोध); } संरचना संदेश * अनुरोध; Req = malloc (sizeof * req); Req- & gt; संदेश = "परीक्षण"; Req- & gt; है स्थिर = 1; free_request (अनुरोध);
इसके अलावा, जब आप एक ऑब्जेक्ट बनाते हैं तो अपनी आवंटित स्मृति को शून्य करने के लिए मत भूलना। इससे आपको बहुत ही परेशानी हो सकती है।
रेक = मॉलोक (आकार का * रिक); Memset (req, 0, sizeof * req);
यह, और req
से NULL
से free_request
पर कोई प्रभाव नहीं होगा। आपको या तो एक संरचना संदेश **
लेने की ज़रूरत है या फ़ंक्शन कॉल्स के बाद इसे स्वयं करें।
Comments
Post a Comment