2012-12-25 18 views
5

मैं इस malloc समारोह का अध्ययन कर रहा हूँ और मैं कुछ मदद इस्तेमाल कर सकते हैं:Malloc और शून्य प्वाइंटर

static void *malloc(int size) 
    { 
     void *p; 

     if (size < 0) 
       error("Malloc error"); 
     if (!malloc_ptr) 
       malloc_ptr = free_mem_ptr; 

     malloc_ptr = (malloc_ptr + 3) & ~3;  /* Align */ 

     p = (void *)malloc_ptr; 
     malloc_ptr += size; 

     if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr) 
       error("Out of memory"); 

     malloc_count++; 
     return p; 
} 

मुझे पता है कि किसी भी प्रकार के लिए malloc समारोह आबंटित करता है स्मृति स्थान है, अगर वहाँ पर्याप्त स्मृति, लेकिन लाइनों है मुझे समझ में नहीं आता है:

p = (void *)malloc_ptr; 
malloc_ptr += size; 

यह किसी भी डेटा प्रकार को कैसे इंगित कर सकता है? मैं बस उस शून्य सूचक या उसके स्थान को समझ नहीं सकता।

नोट: malloc_ptr एक अहस्ताक्षरित लंबे

+0

इस कोड के साथ होता है कर रहे हैं धारणा है कि 'अहस्ताक्षरित long' के लिए सूचक (यानी' malloc_ptr') भी इंगित कर सकते हैं शामिल एक संरेखण बिंदु से, किसी भी अन्य वस्तु के लिए। यह धारणा हमेशा सत्य नहीं होती है (उदाहरण के लिए, कुछ प्रणालियों पर यह 'लंबी डबल' ऑब्जेक्ट्स पर इंगित करने में सक्षम नहीं हो सकता है)। –

+0

कोड मानता है कि किसी भी प्रकार के 4-बाइट संरेखण की तुलना में अधिक कठोर संरेखण आवश्यकता नहीं है। कोड यह नहीं दिखाता कि कैसे 'free_mem_ptr' और' free_mem_end_ptr' प्रारंभ किया गया है। जब कोई और जगह नहीं है तो यह शून्य वापस नहीं आता है। यदि फ़ंक्शन 'त्रुटि() 'रिटर्न, तो सभी नरक टूट जाते हैं। –

उत्तर

5

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

+0

लेकिन यह कैसे पता चलता है कि आवंटित करने के लिए कितनी जगह है? यह आकार मूल्य का उपयोग कैसे करता है? मैं बस इसे नहीं देखता हूँ। उदाहरण के लिए मेरे पास 8 इंच 3 वर्ण और 1 फ्लोट वाला एक स्ट्रक्चर है, जिसे मिस्ट्रक्चर कहा जाता है, और सिद्धांत रूप में इसे स्मृति स्थान आवंटित करना चाहिए, लेकिन मुझे समझ में नहीं आता कि – morcillo

+0

@ मॉर्सीलो उस मामले में आप शायद ' sizeof' ऑपरेटर जो आपके द्वारा घोषित की गई संरचना को उचित रूप से आवंटित करने के लिए आवश्यक बाइट्स में सही आकार निर्धारित करेगा। – squiguy

+0

मुझे पता है कि आकार उसके लिए है, लेकिन जो मुझे समझ में नहीं आता है वह स्मृति में स्थान आवंटित करने के लिए कैसे करता है। malloc_ptr के प्रकार का आकार है लेकिन पी = (शून्य *) malloc_ptr कैसे 8 बाइट्स, या 2 बाइट्स, या 152 बाइट आवंटित करने के लिए जानता है? मॉलोक फ़ंक्शन का कास्टिंग है जो इसे काम करता है? (my_struct *) malloc (sizeof (my_struct)) ?? – morcillo

1

Malloc पूरी तरह से असंरचित, फ्लैट स्मृति का एक हिस्सा के लिए एक सूचक लौटा रहा है। (शून्य *) सूचक का अर्थ है कि यह नहीं जानता कि यह क्या इंगित कर रहा है (कोई संरचना नहीं), केवल यह आकार आकार की कुछ स्मृति को इंगित करता है। malloc के लिए अपने कॉल की

बाहर, आप तो अपने कार्यक्रम है कि इस सूचक कुछ संरचना है बता सकते हैं। यानी, यदि आपके पास संरचना some_struct है तो आप कह सकते हैं: ।

देखें कैसे malloc केवल क्या यह आवंटित करने के लिए जा रहा है के आकार को जानता है, लेकिन वास्तव में यह संरचना है पता नहीं है? मॉलोक के लिए आपका कॉल संरचना के बारे में कोई जानकारी नहीं दे रहा है, केवल आकार का आवंटन कितना स्मृति है।

यह सामान्य होने का सी तरीका है: malloc आप स्मृति की एक निश्चित राशि देता है और यह संरचित स्मृति आप की जरूरत के लिए यह कास्ट करने के लिए अपने काम है।

1

यह malloc का कार्यान्वयन है, इसलिए इसे उन चीजों को करने की अनुमति है जो नियमित कार्यक्रम में वैध नहीं होंगे। विशेष रूप से, यह कार्यान्वयन-परिभाषित रूपांतरण का उपयोग unsigned long से void * तक कर रहा है। प्रोग्राम प्रारंभिक को संख्यात्मक पते को आवंटित स्मृति के बड़े ब्लॉक के सेट पर सेट करता है। तब, जब आप एक आवंटन के लिए पूछना, malloc एक सूचक malloc_ptr के वर्तमान मूल्य से बाहर बनाता है और बाइट्स आप के लिए कहा की संख्या से malloc_ptr बढ़ जाती है। इस तरह, अगली बार जब आप malloc पर कॉल करेंगे तो यह एक नया सूचक लौटाएगा।

यह malloc की सरल संभव कार्यान्वयन के बारे में है। सबसे विशेष रूप से, ऐसा लगता है कि कभी भी मुक्त स्मृति का पुन: उपयोग नहीं किया जाता है।

1
p = (void *)malloc_ptr; 

`malloc` returns a void pointer, which indicates that it is a pointer to a region of 
unknown data type. The use of casting is only required in C++ due to the strong type 
system, whereas this is not the case in C. The lack of a specific pointer type 
returned from `malloc` is `type-unsafe` behaviour according to some programmers: 
malloc allocates based on byte count but not on type. 

malloc_ptr += size; 

`C` implicitly casts from and to `void*`, so the cast will be done automatically. In 
`C++` only conversion to void* would be done implicitly, for the other direction an 
explicit cast is required. 

Wiki प्रकार कास्टिंग के बारे में विवरण,

`malloc` function returns an untyped pointer type `void *`, which the calling code must 
cast to the appropriate pointer type. Older C specifications required an explicit cast 
to do so, therefore the code `(struct foo *) malloc(sizeof(struct foo))` became the 
accepted practice. However, this practice is discouraged in ANSI C as it can mask a 
failure to include the header file in which `malloc` is defined, resulting in 
downstream errors on machines where the int and pointer types are of different sizes, 
such as the now-ubiquitous x86_64 architecture. A conflict arises in code that is 
required to compile as C++, since the cast is necessary in that language. 
1

आप इस दोनों लाइनों को देखने के रूप में,

प्रकार अहस्ताक्षरित की
p = (void *)malloc_ptr; 
malloc_ptr += size; 
यहाँ

आप कर रहे हैं malloc_ptr लंबे इसलिए हम प्रकार कास्टिंग इस चर रहे हैं शून्य प्रकार के लिए और फिर इसे पी में स्टोर करें। और इसी तरह से दूसरा malloc_ptr = malloc_ptr + आकार को दर्शा रहा है;

और यह दोनों कोड डेवलपर की सुविधा के लिए हैं क्योंकि पी प्रकार शून्य पॉइंटर है, इसलिए जब आप मॉलोक का उपयोग करते हैं तो आप नहीं जानते कि फ़ंक्शन द्वारा किस प्रकार की मेमोरी ब्लॉक को वापस करना होगा ताकि यह फ़ंक्शन हमेशा इसे वापस कर सके जेनेरिक शून्य पॉइंटर ताकि हम आवश्यकता के अनुसार हमारे आवेदन में फिर से टाइप करने में सक्षम हैं।

और दूसरा कोड में एक ही है, तो आप तो नकारात्मक में आकार में प्रवेश क्या इस हालत

if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr) 
error("Out of memory"); 
संबंधित मुद्दे