2012-02-23 14 views
39

संभव डुप्लिकेट:
Sizeof an array in the C programming language?
Why does a C-Array have a wrong sizeof() value when it's passed to a function?सी में सरणी की लंबाई कैसे प्राप्त करें? एक समाधान "आकार" है?

नीचे कोड देखें और मुझे सुझाव है कि क्या की "sizeof" कीवर्ड अंतर जब मैं इस तरह इस्तेमाल किया है:

#include<stdio.h> 
#include<conio.h> 
void show(int ar[]); 
void main() 
{ 
    int arr[]={1,2,3,4,5}; 
    clrscr(); 
    printf("Length: %d\n",sizeof(arr)); 
    printf("Length: %d\n",sizeof(arr)/sizeof(int)); 
    show(arr); 
    getch(); 
} 
void show(int ar[]) 
{ 
    printf("Length: %d", sizeof(ar)); 
    printf("Length: %d", sizeof(ar)/sizeof(int)); 
} 

लेकिन उत्पादन इस तरह है:

आउटपुट है:

लंबाई: 10

की लंबाई: 5

की लंबाई: 2

की लंबाई: 1

मुझे ऐसा क्यों मिल रहा है; अगर मैं पूरे डेटा को एक सरणी से दूसरे सरणी में ले जाना चाहता हूं तो मैं कैसे कर सकता हूं?

मुझे सुझाव दें अगर कोई जानता है।

+1

आप सी में किसी भी जानकारी के साथ सी में एक सरणी का आकार नहीं प्राप्त कर सकते हैं। – m0skit0

+0

@ ओली चार्ल्सवर्थ: मैंने Google में खोज की लेकिन मुझे आपके द्वारा प्रदान किया गया लिंक नहीं मिला; प्रदान करने के लिए धन्यवाद; – alishaik786

+0

आप एक सरणी पैरामीटर का आकार नहीं प्राप्त कर सकते हैं। –

उत्तर

60

फंक्शन कॉल में पॉइंटर्स को Arrays क्षय। sizeof का उपयोग करके, किसी भी प्रकार के सूचक के रूप में केवल एक संकेतक के रूप में प्रतिनिधित्व करने के लिए एक सरणी के आकार की गणना करना संभव नहीं है।

आप एक स्पष्ट तर्क जोड़ना होगा:

void show(int *data, size_t count); 

कॉल में, आप वास्तविक सरणियों के लिए sizeof का उपयोग तत्वों की संख्या की गणना करने के कर सकते हैं,: sizeof देता

int arr[] = { 1,2,3,4,5 }; 

show(arr, sizeof arr/sizeof *arr); 

ध्यान दें कि आप char की इकाइयों में आकार, यही कारण है कि sizeof (int) अनिवार्य रूप से विभाजन की आवश्यकता है, या आप एक बहुत अधिक मूल्य प्राप्त करेंगे।

भी ध्यान दें, ब्याज और सफाई के बिंदु के रूप में, sizeof कोई फ़ंक्शन नहीं है। कोष्ठक केवल तभी जरूरी होते हैं जब तर्क एक प्रकार का नाम होता है, क्योंकि तर्क तब एक कास्ट-जैसी अभिव्यक्ति है (उदा। sizeof (int))। इसके बजाय आप डेटा पर sizeof करके वास्तविक प्रकार नामकरण किए बिना अक्सर दूर हो सकते हैं।

+1

शो (एआर, आकार का सरणी/आकार * एआर); – Soran

+0

@ सोरेन धन्यवाद, तय! – unwind

+0

जबकि मुझे लगता है कि यह सबसे अच्छा सामान्य समाधान है - यानी लंबाई और सरणी पास करें - मुझे लगता है कि यह स्थिर मूल्यों के लिए भी ध्यान देने योग्य है (यानी प्रोग्राम निष्पादन के दौरान लंबाई बदलती नहीं है) सबसे सरल समाधान सरणी आकार सेट करना है एक #define preprocessor परिभाषा के साथ स्रोत कोड में। जैसे #define ARRAY_SIZE 5 – Bill

1

शो() 2 बाइट्स पर संग्रहीत सरणी का पता लेता है। Int * ar के रूप में इसके बारे में सोचें।

2

कारण बताता है कि, एक सरणी लेने वाले फ़ंक्शन को लिखते समय, दो पैरामीटर घोषित किए जाते हैं। एक जो सरणी के लिए एक सूचक है, दूसरा जो सरणी के आकार को परिभाषित करता है।

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