Segmentation fault when malloc/free appear in loop in C -


मेरे पास ऐसे प्रोग्राम हैं जो मूल रूप से दिखता है:

  typedef struct cpl_def {int A; इंट बी; इंट ठीक; संरचना cpls * लिंक; } CPLS; Int मुख्य (शून्य) {int n1, n2; Int संख्या = 300; / * कहना * / int * a; ए = नल; Int * apt; Int * b; बी = नल; Int * bpt; सीपीएलएस * सीएलपीटीआर; Cplptr = NULL; Int i, j; (I = 0; i & lt; 2000; i ++) के लिए {if (i == 0) {cplptr = (cpls *) मॉलोक (num * sizeof (cpls)); / * संरचना का निर्माण / / (सीएलपीटीआर) initalize; } / * ... cplptr पर कार्रवाई ... * / FOO (cplptr); / * ... निर्धारित करें कि मुझे आकार n1 के एक सबसेट (आकार n1 का एक सकारात्मक पूर्णांक जो कि पाश के दौरान बदलता है) cplptr से प्रविष्टियों की आवश्यकता है ... * / n1 = FOO2 (cplptr); एन 2 = FOO3 (सीएलपीटीआर); / * ... cplptr में अतिरिक्त एन 2 प्रविष्टियों के लिए ए, बी के मूल्यों को बाहर निकालें ... * / cplptr2 = (cpls *) malloc (n2 * आकार (सीपीएलएस)); / * अतिरिक्त प्रविष्टियों को संग्रहित करने के लिए एक दूसरी संरचना * / / * .... cplptr2 पर कार्रवाई ... * / / * ... cplptr से n1 प्रविष्टियों की प्रतिलिपि को गतिशील रूप से आवंटित एरेज़ में ए, बी आकार के n1 में कॉपी करें ... * / A = मॉलोक (एन 1 * साइज़फ (इंट)); उपयुक्त = & amp; एक [0]; बी = मॉलोक (एन 1 * साइज़फ (इंट)); बीपीटी = & amp; बी [0]; के लिए (जे = 0; जम्मू & lt; num; j ++) {यदि (cplptr [j]। ओ == 1) {(* एपीटी ++) = cplptr [j] .a; (* Bpt ++) = cplptr [j] .b; }} मुक्त (cplptr); / * नि: शुल्क पहली संरचना * / cplptr = (सीपीएलएस *) मॉलोक ((एन 1 + एन 2) * आकारफ (सीपीएल)); / * पहले ढांचे के लिए आकार के n1 के एक सबसेट * / {cplptr [j] .a = a [* बी.आर. *] के लिए उचित आकार * / के लिए (जे = 0; जम्मू & lt; n1; j ++) / * प्रतिबिंबित करने के लिए पहली संरचना को पुन: j]; Cplptr [j]। बी = बी [जे]; Cplptr [j]। ओ = 1; } के लिए (जे = एन 1; जे एंड एलटी; एन 1 + एन 2; जे ++) / * चीजों को पहली संरचना में स्थानांतरित करें / / cplptr [j] .a = cplptr2 [j] .a; Cplptr [j] .b = cplptr2 [j] .b; Cplptr [j]। ओ = cplptr2 [j] ओके; } मुक्त (ए) मुफ़्त (बी) मुक्त (cplptr2); / * मुक्त दूसरी संरचना * /} / * अंत चलना i} / * अंत मुख्य () * /  

यह सिर्फ कंकाल का रूप है, लेकिन यह उम्मीद है कि एक तस्वीर पर्याप्त प्रदान करता है इस तरह यह आम तौर पर ठीक चलती है, लेकिन एन 1, एन 2 के कुछ मूल्यों के लिए, नि: शुल्क (सीपीएलपीटीआर) सेगमेंटेशन गलती का कारण लगता है इसे केवल एक बार कहा जाता है, और मैं cplptr के लिए malloc () कॉल करने के बाद और cplptr के लिए इसी मुफ़्त () से पहले पते की जांच करता हूं।

  .... cplptr = (cpls *) malloc ( संख्या * आकार (सीपीएल)); Printf ("इस% पी \ n", & amp; cplptr [0]) पर ठीक; ... प्रिंटफ़ ("इस% पी \ n", & amp; cplptr [0]) पर ठीक; मुक्त (cplptr) & lt; - विभाजन दोष यहाँ होता है  

पते से मेल खाते हैं, जिसका मतलब है कि मुफ्त () को मुक्त करना चाहिए, यह सही है? जीडीबी प्रोग्राम प्राप्त संकेत SIGSEGV, विभाजन गलती देता है 0xb7ce179b में ?? () /lib/tls/i686/cmov/libc.so.6 से और चरण वर्तमान फ़ंक्शन की सीमा नहीं मिल सकता है

क्या इस तरह से लागू करने के लिए एक और तरीका है कि विभाजन विफलता से बचा जाता है?

धन्यवाद आपके सुझावों के लिए एक लाख! किसी भी विचार पर क्या हो रहा है ??

यदि आप एक क्रैश मुक्त () पर मार रहे हैं, तो यह है ढेर भ्रष्टाचार की वजह से सबसे अधिक संभावना है - आप स्मृति के एक आवंटित ब्लॉक के अंत से परे लिख रहे हैं, एक सूचक को दो बार मुक्त करना, या समान।

लिनक्स पर इन प्रकार के मुद्दों को डिबग करने के लिए एक महान उपकरण है।


Comments