2012-12-22 16 views
9

संभव डुप्लिकेट:
How to find the sizeof(a pointer pointing to an array)सी, malloc() और सरणी लंबाई

मैं सी में एक गतिशील सरणी बनाने का तरीका सीख रहा हूँ, लेकिन एक मुद्दा मैं कर सकते हैं भर में आ गए हैं पता नहीं लगाओ।

अगर मैं कोड का उपयोग करें:

int num[10]; 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

मैं आउटपुट प्राप्त:

sizeof num = 40 
sizeof num[0] = 4 

यह मैं क्या होने उम्मीद थी है। लेकिन अगर मैं जैसी सरणी के आकार malloc:

sizeof num = 8 
sizeof num[0] = 4 

मैं उत्सुक हूँ पता करने के लिए क्यों सरणी के आकार 40 है जब मैं निश्चित का उपयोग करें:

int *num; 
num = malloc(10 * sizeof(int)); 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

तो मैं आउटपुट प्राप्त लंबाई विधि, लेकिन जब मैं malloc() का उपयोग नहीं करता हूं।

+0

'num' दूसरे मामले में int करने के लिए सूचक है और इसका आकार 32 बिट के लिए मशीन यानी पर निर्भर करता है' आधार यह 4 बाइट की है और 64 बिट के लिए यह 1 मामले संख्या में 8 bytes.while की है सूचक नहीं है यह है सरणी का पता 'ताकि आकार() 'सरणी का कुल आकार देता है। । – krpra

उत्तर

16

दूसरे मामले में, num एक सरणी नहीं है, एक सूचक है। sizeof आपको पॉइंटर का आकार दे रहा है, जो आपके प्लेटफ़ॉर्म पर 8 बाइट्स लगता है।

गतिशील रूप से आवंटित सरणी के आकार को जानने का कोई तरीका नहीं है, आपको इसे कहीं और सहेजना होगा। sizeof प्रकार पर लग रहा है, लेकिन आप एक पूरी सरणी प्रकार प्राप्त नहीं कर सकता (एक निर्दिष्ट आकार के साथ सरणी प्रकार, प्रकार int[5]) की तरह किसी भी तरह से malloc का परिणाम से, और sizeof तर्क एक अधूरी प्रकार के लिए लागू नहीं किया जा सकता , int[] की तरह।

+0

आप जानते हैं कि कैसे 'फ्री' फ़ंक्शन काम कर रहा है, कंपाइलर या ओ/एस ढेर आवंटित हिस्सों के रिकॉर्ड/ट्रैक को रखते हुए, फिर केवल पॉइंटर प्रदान करने के साथ इसे 'num' की संख्या की आवश्यकता नहीं है, फिर संकलक विक्रेता क्यों प्रदान कर सकते हैं उपयोगकर्ताओं को ढेर रिकॉर्ड से 'num' पुनर्प्राप्त करने के लिए कार्यक्षमता? चूंकि यह पहले से ही वहां रहा है ... जब भी उपयोगकर्ता 'फ्री (पीआरटी)' –

+0

@ बुद्धिका कतरुरंगा को क्षमा करता है क्षमा करें मुझे यकीन नहीं है कि मैं सही ढंग से समझ गया हूं: क्या आप पूछ रहे हैं कि क्यों कार्यान्वयन स्मृति के आवंटित हिस्सों के ढेर के बारे में विवरण का खुलासा नहीं करते? पसंद है, एक सूचक प्राप्त जानकारी दी? – effeffe

+0

हाँ ... यदि उनके पास गतिशील रूप से आवंटित डेटा के बारे में जानकारी पहले से ही है, तो यदि वे इसे 'मुक्त' के लिए उपयोग करते हैं तो वे ऐसी जानकारी प्राप्त करने के लिए उपयोगकर्ता (डेवलपर) को कार्यक्षमता क्यों प्रदान नहीं कर सकते हैं ... :) –

2

दूसरा आकार एक सूचक के आकार को संदर्भित करता है, कि, आपकी मशीन में - शायद 64 बिट्स - 8 बाइट्स है।

आप गतिशील आवंटित संरचना के आकार को पुनर्प्राप्त करने के लिए sizeof() का उपयोग नहीं कर सकते हैं, लेकिन आप स्थिर आवंटित लोगों के लिए ऐसा कर सकते हैं।

4

Arrays पॉइंटर्स नहीं हैं (कुछ परिस्थितियों में पॉइंटर्स को क्षय, यहां नहीं)।

पहला वाला एक सरणी है - इसलिए sizeof आपको सरणी = 40 बाइट्स का आकार देता है।

दूसरा पॉइंटर है (भले ही यह कितने तत्व इंगित करता है) - sizeof आपको sizeof(int*) देता है।

0

यदि आप आपके द्वारा आवंटित के आकार में जानना चाहते हैं, तो आप "याद" करने की जरूरत है अपने आप को लगता है कि, अपने कोड आवंटन किया था के बाद से। यदि आपके कोड ने आवंटन नहीं किया है, तो यह पता लगाने के लिए कोई संकेत नहीं है कि एक पॉइंटर कितना बड़ा संकेत दे रहा है। आपको बस किसी अन्य तरीके से "जानना" है।

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