2013-07-04 4 views
5

द्वारा 1 जाने या पंक्ति में 2 डी सरणी के लिए स्मृति आवंटन डब्ल्यू क्या सरणी के या इन दो मामलों के लिए स्मृति आवंटन में पहुँचने में प्रभाव होगा:अंतर बी/पंक्ति

1.

int **arr; 
    arr = malloc(sizeof(int) * row * column); 

2.

int **arr; 
    arr = malloc(sizeof(*arr) * row); 
    for(i=0; i<row; i++) 
     arr[i] = malloc(sizeof(**arr) * column)); 
+2

मुझे लगता है कि आपका मतलब है 'malloc (पंक्ति * कॉलम * आकार (int)); ' – Kninnug

+0

हाँ .. – user1660982

उत्तर

6
  • सबसे पहले, "प्रभाव" है कि अपने पहले विधि टूट गया है है। यह int ** सूचक के माध्यम से काम नहीं करेगा।

    आदेश एक शॉट में एक 2 डी सरणी आवंटित करने के लिए के रूप में आप अपने पहले विधि में यह करने के लिए कोशिश कर रहे हैं में, आप वास्तव में पर्याप्त आकार

    int *arr = malloc(row * column * sizeof *arr); 
    // Note: `int *`, not `int **` 
    

    की एक -1 डी सरणी का आवंटन और मैनुअल सूचकांक द्वारा पहुँच प्रदर्शन करने के लिए है पुनः गणना, उदाहरण के लिए arr[i][j] करने के बजाय आपको arr[i * column + j] करना होगा।

    आवंटित सूचक को int **arr में संग्रहीत करने का प्रयास करें और फिर arr[i][j] के रूप में अपनी सरणी तक पहुंचने से केवल क्रैश हो जाएंगे।

  • दूसरे, अपने दूसरी विधि ठीक है। यह सिर्फ दूसरी विधि में आपको वास्तव में कई स्वतंत्र malloc कॉलों द्वारा द्वितीय-स्तर की स्मृति आवंटित करने की आवश्यकता नहीं है। आप आवंटित कर सकते हैं एक में पूरी दूसरे स्तर के स्मृति गोली मार दी

    int **arr = malloc(row * sizeof *arr); 
    int *arr_data = malloc(row * column * sizeof *arr_data); 
    

    और फिर बस पंक्तियों

    for (i = 0; i < row; i++) 
        arr[i] = arr_data + i * column; 
    

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

अब, इन दो तरीकों को देखकर आप आसानी से देख सकते हैं कि उनमें से दोनों अनिवार्य रूप से एक ही काम करते हैं। फर्क सिर्फ इतना है पहली विधि में आप arr + i * column हर बार (ध्यान दें कि arr[i * column + j](arr + i * column)[j] के बराबर है) की गणना के द्वारा ऑन-द-मक्खी पंक्ति की शुरुआत पाते हैं कि है। दूसरी विधि में आप सभी पंक्ति शुरुआत पहले से ही arr_data + i * column सूत्र का उपयोग करके पूर्व की गणना, और उन्हें एक अलग "पंक्ति सूचकांक" सरणी arr में आगे उपयोग के लिए दुकान।

तो, यह मूल रूप से स्मृति उपयोग (पहली विधि कम स्मृति की आवश्यकता है) और गति के बीच व्यापार बंद करने पर निर्भर करता (दूसरी विधि संभावित है, लेकिन जरूरी नहीं कि, तेज)। , arr[i][j] जबकि पहली विधि में आप सूचकांक पुनर्गणना के साथ और अधिक जटिल -1 डी का उपयोग सिंटैक्स का उपयोग करने के लिए है - एक ही समय में दूसरी विधि 2 डी सरणी पहुँच के लिए "प्राकृतिक" वाक्य रचना का समर्थन करता है।

+0

का उल्लेख करने के लिए धन्यवाद धन्यवाद @ एंड्रे बहुत अच्छी तरह से समझाया गया। मैं इसके हर बिट को समझ गया। मैं इस तरह के मूर्खतापूर्ण सवाल अब पूछ नहीं किया जाएगा :) – user1660982

+0

+ मैं इस तकनीक से अनजान 2 डी के लिए स्मृति को आबंटित करने का था, धन्यवाद! –