2011-12-20 14 views
6

मैं निम्नलिखित कोड भर में आया था:स्मृति संरेखण के बारे में malloc क्या गारंटी देता है?

int main() 
{ 
    char *A=(char *)malloc(20); 
    char *B=(char *)malloc(10); 
    char *C=(char *)malloc(10); 
    printf("\n%d",A); 
    printf("\t%d",B); 
    printf("\t%d\n",C); 
    return 0; 
} 
//output-- 152928264  152928288 152928304 

मुझे पता है कि कैसे आवंटन और गद्दी malloc() द्वारा किया जाता है चाहता हूँ। आउटपुट को देखते हुए मैं देख सकता हूं कि शुरुआती पता 8 का एक बहु है। क्या कोई अन्य नियम हैं?

+2

जो भी "नियम" आप अपने कंप्यूटर पर क्या मॉलोक करते हैं, इसका अध्ययन करके "सीखते हैं" ... जैसे ही आप किसी अन्य कंप्यूटर पर जाते हैं, या कंपाइलर विकल्प बदलते हैं, या चंद्रमा के चरण में परिवर्तन करते हैं, तब तक अनजान होना चाहिए। .., ... :) – pmg

+3

एक सूचक मुद्रित करने के लिए आपको वास्तव में '"% p "का उपयोग करना चाहिए और 'शून्य *':' printf ("% p", (शून्य *) ए); ' – pmg

+0

मैं नहीं वास्तव में अपने प्रश्न को समझें। –

उत्तर

8

this documentation page को जीएनयू प्रणाली में malloc या realloc द्वारा लौटाए गए एक ब्लॉक का पता हमेशा (64-बिट सिस्टम पर या सोलह) आठ की एक बहु Accdording,

है।

सामान्य रूप से, malloc कार्यान्वयन सिस्टम-विशिष्ट हैं। जब आप free पर कॉल करते हैं, तो वे सभी स्मृति को सही ढंग से रिलीज़ करने में सक्षम होने के लिए अपनी आवंटन (उदाहरण के लिए आवंटित ब्लॉक की वास्तविक लंबाई) के लिए कुछ स्मृति रखते हैं। यदि आपको किसी विशिष्ट सीमा से संरेखित करने की आवश्यकता है, तो अन्य कार्यों का उपयोग करें, जैसे कि posix_memalign

4

एकमात्र मानक नियम यह है कि malloc द्वारा लौटाया गया पता किसी भी प्रकार के चर को स्टोर करने के लिए उपयुक्त रूप से गठबंधन किया जाएगा। वास्तव में इसका मतलब प्लेटफ़ॉर्म-विशिष्ट है (क्योंकि संरेखण आवश्यकताओं प्लेटफ़ॉर्म से प्लेटफ़ॉर्म तक भिन्न होती हैं)।

0

32 बिट Linux सिस्टम के लिए:
जब malloc() स्मृति को आबंटित है, यह 8 (8 की गद्दी) के गुणक में स्मृति को आबंटित और बहीखाता के लिए अतिरिक्त 8 बाइट आवंटित।

उदाहरण के लिए:

malloc (10) और malloc (12) (गद्दी + 8 बहीखाता के लिए बाइट के बाद 16 बाइट्स) 24 बाइट्स स्मृति आवंटित करेगा।

malloc() पैडिंग करें क्योंकि लौटाए गए पते आठ के गुणक होंगे, और इस प्रकार किसी भी प्रकार के पॉइंटर्स के लिए मान्य होंगे। जब हम नि: शुल्क फ़ंक्शन कॉल करते हैं तो बहीखाता 8 बाइट्स का उपयोग किया जाता है। आवंटित स्मृति की बहीखाता बाइट स्टोर की लंबाई।

संबंधित मुद्दे