c - returning reference of local variable -
संभव डुप्लिकेट:
जीसीसी 4.4.4 सी 8 9 सी
मुख्य में मैं फ़ंक्शन को पाठ की एक पंक्ति को पास करने के लिए फ़ंक्शन बुलाता हूं। मैं इस पर कुछ ऑपरेशन करना चाहता हूं। हालांकि, इसका मतलब यह होगा कि लाइन का कोई उपयोग नहीं है। इसलिए मेरे get_string फ़ंक्शन में मैं सामग्री की प्रतिलिपि बनाउंगा और परिणाम वापस कर दूंगा। एकमात्र समस्या यह है कि इस नतीजे की स्मृति खो जाएगी और अप्रत्याशित कुछ को इंगित करेगी।
मैं बस सोच रहा हूँ कि मैं कैसे परिणाम वापस पास कर सकता हूं, बिना डेटा के क्रमबद्ध रेखा को रख सकता हूं?
किसी भी सलाह के लिए बहुत धन्यवाद,
कोड Snippet main:
अगर (fgets (line_data, (size_t) STRING_SIZE, fp) == नल) {fprintf (stderr, "चेतावनी: पाठ फ़ाइल संख्या पढ़ने में त्रुटि त्रुटि [% d] N ", i); } यदि (get_string (line_data)! = NULL) {यदि (strcmp (get_string (line_data), "END") == 0) ब्रेक; } Else {fprintf (stderr, "चेतावनी: छात्र का नाम पंक्ति में नहीं मिल सकता है [% d] \ n", i); } / * छात्र जानकारी भरें * / strncpy (स्टड [i] .name, line_data, (size_t) STRING_SIZE);
इस फ़ंक्शन को कॉल करें
char * get_string (char * line_data) {char * quote = NULL; चार परिणाम [STRING_SIZE] = {0}; Strncpy (परिणाम, पंक्ति_डेटा, (आकार_टी) STRING_SIZE); / * अंतिम अवसर * / यदि ((उद्धरण = 'strrchr (परिणाम,' '')) == नल) {fprintf (stderr, "पाठ फ़ाइल गलत रूप से इस छात्र के लिए प्रारूपित \ n"); वापसी नल;} / * डालें बोली के स्थान पर नल * / * उद्धरण = '\ 0'; / * 1 स्थान * / memmove (परिणाम -1, परिणाम, स्ट्रेलन (परिणाम) + 1) स्थानांतरित करके पहला बोली ओवरवाइट; परिणाम वापसी;}
अपने सीधे प्रश्न के लिए - या तो उपयोगकर्ता का उपयोग करें और फ़ंक्शन के उपयोगकर्ता को बताएं कि उसे रिटर्न पॉइंटर (यह मेमोरी लीक की संभावना है क्योंकि सी में रिटर्न वैल्यू को अनदेखा करना इतना आसान है), या प्राप्त बफर के रूप में दूसरा पैरामीटर प्रदान करें:
char * get_string (const char *
फ़ंक्शन के लिए तीसरा पैरामीटर पता है कि प्राप्त बफर कितना बड़ा है।
अब आपके कोड में - लाइन memmove (परिणाम - 1, परिणाम, strlen (परिणाम) + 1);
आपको भ्रष्ट कर देता है आर स्टैक।
Comments
Post a Comment