2012-04-22 13 views
5

संभव डुप्लिकेट रिटर्न:
sizeof array of structs in C?
sizeof an array passed as function argumentसी sizeof पूर्णांक सरणी हमेशा 4

बस एक बुनियादी sum() समारोह लिखने की कोशिश कर।

int sum(int arr[]) { 
    int total = 0 , i = 0 , l = sizeof arr; 

    for(i=0;i<l;i++) { 
     total += arr[i]; 
    } 

    return total; 
} 

l हमेशा 4 के बराबर है (मैं अंत में sizeof int से विभाजित करने के लिए जानते हैं)

विंडोज 7

+2

'arr' एक सूचक है, एक सरणी नहीं है। फ़ंक्शन घोषणा में उपयोग किए जाने वाले वाक्यविन्यास 'int sum (int * arr)' के लिए केवल आंख कैंडी है। आप [comp.lang.c FAQ] (http://c-faq.com/) की सेक्शन 6 पढ़ना चाहेंगे। – pmg

+0

64 बिट मशीन पर संकलित करें/आपको 8 देखना चाहिए क्योंकि आप पॉइंटर के आकार को देख रहे हैं, सरणी का आकार नहीं। –

उत्तर

11

में डिफ़ॉल्ट संकलक विकल्पों के साथ देव-सी ++ चल समारोह तर्क, सरणियों संकेत के क्षय के रूप में तत्व प्रकार के लिए, sizeof arrsizeof(elem*) है।

आपको तत्वों की संख्या को अतिरिक्त तर्क के रूप में पारित करना होगा, यह निर्धारित करने का कोई तरीका नहीं है कि पॉइंटर से सरणी के पहले तत्व (जो वास्तव में उस स्थिति में पारित होता है)।

+0

यदि प्रश्न में '4' है, तो पोस्ट 'sizeof (सूचक)'

+0

मैं पहले तत्व के बजाय सरणी को कैसे इंगित करूं? दूसरी तर्क के रूप में लंबाई को पास करना एक कमजोरी नहीं है जिसे प्रोग्रामर को अनुकूलित करना चाहिए। –

+1

यदि आपके पास 'int arr [5]; 'है, तो' 'arr' आपको पांच' int', int (*) [5] 'की सरणी में पॉइंटर देता है। पता, हालांकि, सरणी के पहले तत्व का पता '& arr [0] 'जैसा ही है। आप किस प्रकार का पॉइंटर चाहते हैं स्थिति पर निर्भर करता है। सरणी तत्वों को संक्षेप में, जब तक कि आप प्रत्येक आकार ('int sum_5 (int (*) [5]) के लिए एक अलग कार्य नहीं करना चाहते हैं;', 'int sum_6 (int (*) [6]); ', आपके पास है 'int *' और तत्वों की संख्या को पारित करने के लिए। इस तरह सी काम करता है। –

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