सबसे पहले, "प्रभाव" है कि अपने पहले विधि टूट गया है है। यह 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 डी सरणी पहुँच के लिए "प्राकृतिक" वाक्य रचना का समर्थन करता है।
मुझे लगता है कि आपका मतलब है 'malloc (पंक्ति * कॉलम * आकार (int)); ' – Kninnug
हाँ .. – user1660982