संकलक निम्नलिखित कोड पर रनटाइम सीगफ़ॉल्ट को फेंकता है:
#include & lt; iostream & gt; #include & lt; स्ट्रिंग & gt; नेमस्पेस एसटीडी का उपयोग करना; संरचना नोड {Int डेटा; शून्य * अगला; स्ट्रिंग नोडप्रकार; }; नोड * initNode (इंट डेटा) {नोड * n = (नोड *) मॉलोक (आकारफ (नोड)); N- & gt; डेटा = डेटा; N- & gt; अगला = नल; N- & gt; नोडप्रकार = "नोड"; // यदि यह पंक्ति टिप्पणी की जाती है तो यह अन्य काम करता है segfault return n; } Int main () {नोड * n1 = initNode (10); Cout & lt; & lt; N1- & gt; डेटा & lt; & lt; endl; } क्या कोई कृपया समझा सकता है कि स्ट्रिंग असाइनमेंट एक स्ट्रक्चर के अंदर काम क्यों नहीं करता है जो कि गतिशील रूप से आवंटित किया जाता है जहां स्थिर आवंटन के मामले में यह क्यों काम करता है?
जहां निम्नलिखित है जिस तरह से यह काम करता है:
<पूर्व> नोड initNode (स्ट्रिंग डेटा) {नोड n; N.data = डेटा; // यह नोड निर्माण के लिए काम करता है स्थिर रूप से n.next = NULL; N.nodeType = "नोड"; // और यहां तक कि नोड सृजन के लिए यह काम स्थिर रूप से वापस n; } और फिर मुख्य कार्य में:
int main () {नोड n2 = initNode ("हैलो"); Cout & lt; & lt; N2.data & lt; & lt; endl; }
यह काम नहीं करता है क्योंकि आप वास्तव में एक मेमोरी में नोड उदाहरण जिसे आप malloc ।
इसके बजाय आपको new का उपयोग करना चाहिए:
नोड * n = नया नोड {}; malloc केवल स्मृति को आबंटित करता है, उसे पता नहीं है कि क्लास क्या है या कैसे एक को इन्स्तांत करना है आपको आम तौर पर सी ++ में इसका उपयोग नहीं करना चाहिए।
नया आबंटित करता है स्मृति और वर्ग का एक उदाहरण बनाता है।
No comments:
Post a Comment