दिलचस्प पोस्ट
क्रिया फ़िल्टर विशेषता से पुनर्निर्देशन HTML को सादा पाठ में कनवर्ट करने के लिए jsoup का उपयोग करते समय मैं लाइन ब्रेक को कैसे सुरक्षित रखूं? सी # में कई इनपुट डिवाइस के बीच अंतर कैसे करें Xcode समर्थन ब्लूटूथ कम ऊर्जा में iPhone सिम्युलेटर क्या है? स्थानीय होस्ट पर PHP मेल () फ़ंक्शन स्विफ्ट की जांच करने के लिए शॉर्टहैंड क्या स्विफ्ट में एक ऑब्जेक्ट मौजूद है? कैसे विशेष वर्णों से बचने के लिए 'में एंड्रॉइड एसक्लाइट में शॉर्ट सर्किट मूल्यांकन और दुष्प्रभाव एक्सएमएल सीरियललाइजेशन के जरिए आपको लोड किए जाने पर आप कैसे पता लगा सकते हैं? रीसायकलदृश्य में एकल चयन HTML पृष्ठ में सभी पाठ नोड्स ढूंढें पायथन सामान्य तर्क बनाम कीवर्ड तर्क स्विफ्ट में मैं एक पूर्ण स्क्रीन स्क्रीनशॉट कैसे ले सकता हूं? नेविगेशन नियंत्रक के साथ सही तरीके से टैब बार नियंत्रक कैसे लागू करें JSON को सरणी कन्वर्ट करें

मॉलोक () के बाद पॉइंटर को सीधा सीमा से लिखना त्रुटि उत्पन्न नहीं कर रहा है

जब मैं नीचे कोड की कोशिश करता हूँ यह ठीक काम करता है क्या मैं कुछ भूल रहा हूँ?

main() { int *p; p=malloc(sizeof(int)); printf("size of p=%d\n",sizeof(p)); p[500]=999999; printf("p[0]=%d",p[500]); return 0; } 

मैंने इसे malloc (0 * sizeof (int)) या कुछ के साथ की कोशिश की, लेकिन यह सिर्फ ठीक काम करता है। प्रोग्राम केवल तब क्रैश हो जाता है जब मैं मॉलोक का उपयोग बिल्कुल नहीं करता। इसलिए यहां तक ​​कि अगर मैं सरणी पी के लिए 0 मेमोरी आवंटित करता हूं, यह अभी भी मूल्यों को ठीक से संग्रहीत करता है। तो फिर क्यों मैं भी malloc के साथ परेशान कर रहा हूँ?

वेब के समाधान से एकत्रित समाधान "मॉलोक () के बाद पॉइंटर को सीधा सीमा से लिखना त्रुटि उत्पन्न नहीं कर रहा है"

यह ठीक काम करने के लिए प्रतीत हो सकता है, लेकिन यह बिल्कुल सुरक्षित नहीं है। स्मृति के आवंटित ब्लॉक के बाहर डेटा लिखकर आप कुछ डेटा को अधिलेखित कर रहे हैं जिसे आपको नहीं करना चाहिए। यह segfaults और अन्य स्मृति त्रुटियों का सबसे बड़ा कारणों में से एक है, और आप इस लघु कार्यक्रम में काम करने के लिए दिखाई देने वाले इसके साथ क्या देख रहे हैं, इसके कारण मूल कारणों का शिकार करना इतना कठिन है।

इस लेख को पढ़ें, खासकर स्मृति भ्रष्टाचार का हिस्सा, समस्या को समझने के लिए।

Valgrind स्मृति त्रुटियों का विश्लेषण करने के लिए एक उत्कृष्ट उपकरण है जैसे कि आप जो प्रदान करते हैं

@ डेविड ने अच्छी टिप्पणी की है निम्न कोड को चलाने के लिए अपना कोड चलाने के परिणामों की तुलना करें एक रनटाइम त्रुटि में उत्तरार्द्ध के परिणाम (बहुत ज्यादा उपयोगी आउटपुट के साथ नहीं!) Ideone.com पर क्लिक करें (लिंक पर क्लिक करें), जबकि आप जितनी अनुभवी हैं, उतने सफल होते हैं।

 main() { int *p; p=malloc(sizeof(int)); printf("size of p=%d\n",sizeof(p)); p[500]=999999; printf("p[0]=%d",p[500]); p[500000]=42; printf("p[0]=%d",p[500000]); return 0; } 

यदि आप मेमोरी आवंटित नहीं करते हैं, पी में कचरा है, इसलिए इसे लिखना संभवतः विफल हो जाएगा। एक वैध malloc कॉल करने के बाद, p मान्य स्मृति स्थान इंगित कर रहा है और आप इसे लिख सकते हैं। आप स्मृति लिख रहे हैं कि आपको लिखना नहीं चाहिए, लेकिन कोई भी हाथ नहीं पकड़ सकता है और आपको इसके बारे में बताता है। यदि आप अपना प्रोग्राम और स्मृति डीबगर जैसे वाल्ग्रिंड चलाते हैं, तो यह आपको बताएगा। सी में आपका स्वागत है

आपकी मेमोरी के अंत में अतीत को लिखना अपरिभाषित व्यवहार ™ है, जिसका मतलब है कि कुछ भी हो सकता है- आपके कार्यक्रम संचालन सहित, जैसा कि आपने जो किया वह बिल्कुल कानूनी था। आपके प्रोग्राम के चलने के कारण जैसे कि आपने malloc(501*sizeof(int)) पूरी तरह से कार्यान्वयन-विशिष्ट किया है, और वास्तव में कुछ के लिए विशिष्ट हो सकता है, जिसमें चंद्रमा के चरण भी शामिल हैं

इसका कारण यह है कि पी को कुछ पता सौंपा जाएगा, चाहे आप किस आकार के साथ मॉलक () का उपयोग करें। यद्यपि, शून्य आकार के साथ आप अमान्य मेमोरी को संदर्भित करेंगे क्योंकि स्मृति को आवंटित नहीं किया गया है, लेकिन यह उस स्थान के अंदर हो सकता है जो प्रोग्राम दुर्घटना का कारण नहीं होगा, हालांकि व्यवहार अपरिभाषित हो जाएगा।

अब अगर आप malloc () का उपयोग नहीं करते हैं, तो यह एक गड़बड़ स्थान की ओर इशारा करेगा और उस तक पहुंचने की कोशिश कर रहा है जो प्रोग्राम क्रैश होने की संभावना है।

मैंने इसे malloc (0 * sizeof (int) के साथ की कोशिश की)

C99 के अनुसार यदि malloc को पार करने वाला आकार 0 है, तो सी रनटाइम या तो एक नल सूचक या आवंटन व्यवहार कर सकता है जैसे कि अनुरोध शून्य-शून्य आवंटन के लिए था, सिवाय इसके कि लौटे सूचक को डीरेंस नहीं किया जाना चाहिए। तो यह कार्यान्वयन परिभाषित है (जैसे कुछ कार्यान्वयन शून्य-बफर बफर वापस लौटते हैं) और आपके मामले में आपको एक शून्य सूचक वापस नहीं मिलता है, लेकिन आप एक संकेतक का उपयोग कर रहे हैं जिसे आप का उपयोग नहीं करना चाहिए। यदि आप इसे किसी भिन्न क्रम में प्रयास करते हैं एक शून्य सूचक वापस मिल सकता है

जब आप malloc () को कॉल करते हैं तो स्मृति का एक छोटा सा हिस्सा आपके लिए एक बड़ा पृष्ठ से बना है

  malloc(sizeof(int)); 

वास्तव में एक 32 बिट मशीन पर 4 बाइट्स आवंटित नहीं करता है (ऑलोकेटर ने इसे न्यूनतम आकार तक पैड कर दिया है) + हेप मेटा डेटा का आकार अपने जीवनकाल के माध्यम से ट्रैक करने के लिए इस्तेमाल किया (विखंडू उनके आकार के आधार पर डिब्बे में रखे गए हैं और इन-उपयोग में चिह्नित या आवंटक द्वारा मुक्त)। hxxp: //en.wikipedia.org/wiki/Malloc या अधिक विशेष रूप से hxxp: //en.wikipedia.org/wiki/Malloc#dlmalloc_and_its_derivatives यदि आप इसका लिनक्स पर परीक्षण कर रहे हैं।

तो अपने हिस्से की सीमा से परे लिखना का मतलब यह नहीं है कि आप क्रैश करने जा रहे हैं। पी +5000 में आप उस प्रारंभिक भाग के लिए आवंटित पृष्ठ की सीमा के बाहर नहीं लिख रहे हैं, ताकि आप तकनीकी रूप से एक मान्य मैप पते पर लिख रहे हों। स्मृति भ्रष्टाचार में आपका स्वागत है http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=heap+overflows

हमारा चेकपॉइंटर टूल इस त्रुटि का पता लगा सकता है यह जानता है कि पी के आवंटन में 4 बाइट्स का हिस्सा था, और इस प्रकार असाइनमेंट किया जाता है, यह उस क्षेत्र के बाहर होता है जिसके लिए पी को आवंटित किया गया था। यह आपको बताएगा कि पी [500] असाइनमेंट गलत है।