दिलचस्प पोस्ट
एक निकटतम स्मृति ब्लॉक क्या है? मैं विंडोज में डिफ़ॉल्ट पायथन संस्करण कैसे सेट करूँ? एईएस (एईएस-सीसीसी -128, एईएस-सीबीसी -192, एईएस-सीबीसी -256) एन्क्रिप्शन / डिक्रिप्शन के साथ एक्सप्लॉएसएल सी नेविगेशन ड्रॉवर के साथ एक्शनबार को कैसे स्लाइड किया जाए एक अनुभाग में UITableView पंक्ति को क्रमबद्ध करने के लिए कैसे करें फ्लेक्सबॉक्स: नीचे और केंद्र के बीच संरेखित करें? उद्देश्य-सी में टाइपिंगफेम एनएम्म् क्या है? वेब स्क्रैपिंग जावास्क्रिप्ट पेज पायथन के साथ "प्रारंभकर्ता तत्व संकलन-समय स्थिर नहीं है" क्यों? विभिन्न लंबाई के साथ बहुआयामी सरणी Android में 3D हिंडोला जीएसओएन फ़ील्ड का उपयोग क्यों नहीं करता है और गेटर्स / सेटर्स का उपयोग नहीं करता है? त्रुटि: मुक्त (): अमान्य अगले आकार (तेज़): लॉलीपॉप में ऐप मैच करने के लिए स्टेटस बार का रंग कैसे बदल सकता है? किसी दिए गए आकार (जैसा कि क्षमता के विपरीत) की सूची <T> आरंभ करने के लिए?

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

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

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 के साथ परेशान कर रहा हूँ?

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

यह ठीक काम करने के लिए प्रतीत हो सकता है, लेकिन यह बिल्कुल सुरक्षित नहीं है। स्मृति के आवंटित ब्लॉक के बाहर डेटा लिखकर आप कुछ डेटा को अधिलेखित कर रहे हैं जिसे आपको नहीं करना चाहिए। यह 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] असाइनमेंट गलत है।