2010-11-02 20 views
13

सी में: फ़ंक्शन पर भेजने के बाद, आपको structs की सरणी में तत्वों की संख्या कैसे मिलती है?सी: किसी सरणी में तत्वों की संख्या ढूंढना []

int main(void) { 
    myStruct array[] = { struct1, struct2, struct3, struct4, struct5, struct6 }; 
    printf("%d\n", sizeof(array)); 
    printf("%d\n", sizeof(array[0])); 
    f(array); 
} 
void f(myStruct* array) { 
    printf("%d\n", sizeof(array)); 
    printf("%d\n", sizeof(array[0])); 
} 

किसी कारण से मुख्य में printf f में printf से अलग-अलग परिणाम दिखाता है। मेरी आवश्यकता यह जानना है कि सरणी में कितने तत्व हैं।

+0

क्योंकि 'sizeof() 'एक संकलन-समय ऑपरेटर है और सदस्य फ़ंक्शन नहीं है (जैसा कि C++ में है)। – ruslik

उत्तर

18

आप नहीं कर सकते।

आप कार्य करने के लिए आकार पारित करने के लिए, उदाहरण के लिए है:

void f(myStruct* array, size_t siz); 

यह भी ध्यान दें f सरणी में, एक सूचक है कि जब तक main में यह एक सरणी है। Arrays और पॉइंटर्स अलग-अलग चीजें हैं।

+1

'size_t' का उपयोग क्यों करें? क्या आप सरणी लंबाई के लिए केवल एक पूर्णांक का उपयोग नहीं कर सकते थे, या यह किसी भी तरह से सुरक्षित नहीं है? –

+2

@ क्रिस्टियन मान: कई कारणों सहित: 'sizeof' द्वारा लौटाए गए मान का प्रकार 'size_t' है; सरणी आकार कभी नकारात्मक नहीं हो सकते हैं, इसलिए सरणी आकार के लिए एक हस्ताक्षरित प्रकार का उपयोग करना समझ में आता है; 'size_t' को बाइट्स की अधिकतम संख्या को पकड़ने के लिए काफी व्यापक होने की गारंटी है जिसे किसी भी समय आवंटित किया जा सकता है, जबकि 'int' नहीं है (IOW, यदि टी की सरणी में 2^64 बाइट्स हो सकते हैं, तो' size_t' 64 बिट चौड़े होने की गारंटी है, लेकिन 'int' केवल कम से कम 16 बिट चौड़े होने की गारंटी है); –

+0

आकार के चारों ओर गुजरने का एक विकल्प सरणी को एक समय-परीक्षण समाधान को समाप्त करने के लिए है, लेकिन यह केवल तभी काम करता है जब आपके पास पॉइंटर्स की एक सरणी हो (जो सी में सरणी की सरणी से अधिक आम है)। –

10

एफ array में एक सूचक है, मुख्य array में एक सरणी है।

+5

और एक बार आपके पास पॉइंटर होने पर आप तत्वों की संख्या निर्धारित नहीं कर सकते हैं। –

0

आप सी में लगातार किसी सरणी में तत्वों की संख्या नहीं बता सकते हैं। विशेष रूप से यदि आप पॉइंटर्स के माध्यम से सरणी पास करते हैं।

आमतौर पर, यदि आप फ़ंक्शन में सरणी आकार का उपयोग करना चाहते हैं, तो इसे पैरामीटर के रूप में पास करें।

+1

किसी सरणी में तत्वों की संख्या हमेशा 'आकार के सरणी/आकार के सरणी [0] 'द्वारा दी जाती है। जब तक सरणी एक ईमानदार-से-ईश्वर सरणी है, यह बहुत आसान है :) – pmg

1

आपको उस डेटा को फ़ंक्शन में एक अलग पैरामीटर के रूप में पास करना होगा। सी और सी ++ में जैसे ही एक सरणी को एक फ़ंक्शन में पास किया जाता है, सरणी एक सूचक में खराब हो जाती है। पॉइंटर्स के पास कोई धारणा नहीं है कि वे किस सरणी में इंगित करते हैं।

आकार प्राप्त करने का एक आम तरीका सरणी घोषित करना है और फिर एक तत्व के आकार से कुल आकार को विभाजित करके तुरंत सरणी तत्व गणना प्राप्त करें। इस तरह:

struct my_struct my_struct_array[] = { 
{"data", 1, "this is data"}, 
{"more data", 2, "this is more data"}, 
{"yet more", 0, "and again more data"} 
}; 
const size_t my_struct_array_count = sizeof(my_struct_array)/sizeof(my_struct_array[0]); 
0

जब आप sizeofmain में उपयोग करते हैं, तो यह सरणी का मूल्यांकन कर रहा है, और वास्तविक सरणी का आकार देता है।

आप f में sizeof का उपयोग करते हैं, तो आप एक समारोह के लिए एक तर्क के रूप सरणी के नाम उत्तीर्ण कर ली है, तो यह एक सूचक को सड़ा हुआ है, इसलिए sizeof आप एक सूचक के आकार के बारे में बताता है।

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

1

उपरोक्त कोड में, फ़ंक्शन f() को यह जानने का कोई तरीका नहीं है कि आपके मूल सरणी में कितने तत्व थे। यह भाषा की एक विशेषता है और इसके चारों ओर कोई रास्ता नहीं है। आपको लंबाई पारित करनी होगी।

1

C reference कहता है, आप तब तक ऐसा नहीं कर सकते जब तक कि अंतिम तत्व अद्वितीय न हो या आप फ़ंक्शन में सरणी तत्वों की गिनती पास न करें।

1

आपको सरणी को एक विशेष मूल्य के साथ समाप्त करना होगा और फ़ंक्शन में आपको उस मान पर गिनना होगा, यह है कि कैसे strlen() काम करता है यह शून्य '\ 0' मान तक गिना जाता है।

+0

यह निश्चित रूप से एक समाधान है, लेकिन यह केवल एकमात्र नहीं है। –

+0

आप फ़ंक्शन को एक सूचक (स्मृति में एक पता) भेज रहे हैं, यह कैसे गिना जाएगा, अगर यह नहीं पता कि यह कहां समाप्त हो रहा है। सी में कोई सरणी प्रकार नहीं है जैसा कि हम उच्च भाषाओं में जानते हैं। आप सी ++ में एक सरणी वर्ग बना सकते हैं जो इसके आकार को स्टोर करता है (या पहले से परिभाषित लोगों का उपयोग करता है) – bkilinc

0

आप अपने सरणी के लिए प्रारूप का उपयोग कर सकते हैं। मैं स्ट्रिंग तत्वों का उपयोग कर रहा हूं, इसे संरचना के लिए काम करना चाहिए।

#define NULL "" 
#define SAME 0 

static char *check[] = { 
     "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256", 
     "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes", 
     "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", 
     "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt", 
     "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320", 
     "lzo", "cts", "zlib", NULL 
}; // 38 items, excluding NULL 
मुख्य()

char **algo = check; 
int numberOfAlgo = 0; 


while (SAME != strcmp(algo[numberOfAlgo], NULL)) { 
    printf("Algo: %s \n", algo[numberOfAlgo++]); 
} 

printf("There are %d algos in the check list. \n", numberOfAlgo); 

आप उत्पादन मिलना चाहिए में

: वैकल्पिक रूप से

Algo: des 
    : 
    : 
Algo: zlib 

There are 38 algos in the check list. 

, आप शून्य का उपयोग नहीं करना चाहते हैं, इस के बजाय कार्य करें:

numberOfAlgo = 0; 

while (*algo) { 
    printf("Algo: %s \n", *algo); 
    algo++;   // go to the next item 
    numberOfAlgo++; // count the item 
} 

printf("There are %d algos in the check list. \n", numberOfAlgo); 
0

अपने समाधान के लिए एक उदाहरण के रूप में:

को देखते हुए

struct contain { 
char* a;  // 
int allowed; // 

struct suit { 
    struct t { 
      char* option; 
      int count; 
    } t; 

    struct inner { 
      char* option; 
      int count; 
    } inner; 
} suit; 
}; 

// जैसे। मुख्य में

 struct contain structArrayToBeCheck[] = { 
    { 
     .a = "John", 
     .allowed = 1, 

     .suit = { 
      .t = { 
       .option = "ON", 
       .count = 7 
      }, 

      .inner = { 
       .option = "OFF", 
       .count = 7 
      } 
     } 
    }, 
    { 
     .a = "John", 
     .allowed = 1, 

     .suit = { 
      .t = { 
       .option = "ON", 
       .count = 7 
      }, 

      .inner = { 
       .option = "OFF", 
       .count = 7 
      } 
     } 
    }, 
    { 
     .a = "John", 
     .allowed = 1, 

     .suit = { 
      .t = { 
       .option = "ON", 
       .count = 7 
      }, 

      .inner = { 
       .option = "OFF", 
       .count = 7 
      } 
     } 
    }, 
    { 
     .a = "John", 
     .allowed = 1, 

     .suit = { 
      .t = { 
       .option = "ON", 
       .count = 7 
      }, 

      .inner = { 
       .option = "OFF", 
       .count = 7 
      } 
     } 
    } 

}; 

प्रारंभ()

printf("Number of Struct within struct array: %d \n", sizeof(structArrayToBeCheck)/sizeof(struct contain)); 

आप सही उत्तर देता है।

1

ध्यान दें कि मुख्य() में, सरणी वास्तविक सरणी को संदर्भित करती है और इसलिए आकार() आवश्यक उत्तर देता है।

लेकिन जब आप इसे फ़ंक्शन पैरामीटर के रूप में पास करते हैं, तो आप वास्तव में पॉइंटर चर 'सरणी' में संग्रहीत सरणी के पहले तत्व का पता गुजर रहे हैं।
तो अब आकार() आकार सूचक का आकार देता है, यही कारण है कि यह वास्तविक उत्तर से अलग है।

संभव समाधान

1.Declare हो सकता है सरणी विश्व स्तर पर

2.Pass समारोह पैरामीटर के रूप में सरणी आकार आशा है कि यह मदद करता है!

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