उद्धरण:के एंड आर से एक वाक्य की शुद्धता के बारे में अनिश्चित - पॉइंटर अंकगणित | प्रक्रिया मुक्त
परीक्षण अगर (allocbuf + ALLOCSIZE - allocp> = एन) { चेकों हो, तो पर्याप्त जगह n पात्रों के लिए एक अनुरोध को पूरा करने के लिए। यदि वहां है, allocp का नया मान Allocbuf के अंत से अधिकतर होगा।
कोड है जो इसे से संबंधित है:
#define ALLOCSIZE 10000 /* size of available space */
static char allocbuf[ALLOCSIZE]; /* storage for alloc */
static char *allocp = allocbuf; /* next free position */
char *alloc(int n)
/* return pointer to n characters */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
allocp += n;
return allocp - n; /* old p */
} else
/* not enough room */
return 0;
}
void afree(char *p) /* free storage pointed to by p */
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
तो यह कैसे allocbuf में अंतिम स्थिति से बाहर हो सकता है? मेरी राय में ऑलोकबफ [99 99]
उस से परे कुछ भी है। allocbuf [10000] गलत है और एक स्मृति रिसाव है, क्या मैं सही हूँ?
प्रश्न के दूसरे भाग - मैं हालांकि इसके नाम के अनुसार afree समारोह एक सरणी में विशेष स्थानों पर बचाया मूल्य हटा रहा है कि। हालांकि, जैसा कि मैं देख सकता हूं कि यह सिर्फ "कुछ रिकॉर्डिंग हेड" को सरणी के बाईं ओर कुछ स्थानों पर ले जाता है? वहां सहेजा गया डेटा छूटा रहता है।
+1। – perilbrain
यदि 'allocp' 'allocbuf [10000]' को इंगित करता है, तो इसका मतलब है कि भंडारण पूरी तरह से उपयोग किया जाता है (अंतिम टुकड़ा बिल्कुल' n' प्रविष्टियां थी) और इसलिए बाद में 'आवंटन') '0' वापस आ जाएगा। उद्धरण यह नहीं कहता कि इस "अवैध" सूचक का उपयोग करने की अनुमति है, और यह वास्तव में 'alloc()' से वापस नहीं आ गया है। – evnu
एफवाईआई, जो आपके लिए आवंटित स्मृति से अधिक है, एक स्मृति रिसाव नहीं है। एक मेमोरी रिसाव आवंटित स्मृति का ट्रैक खो रहा है ताकि आप बाद में उस स्मृति को मुक्त नहीं कर सकें। –