सी

2012-07-04 5 views
5

में पूर्ण सरणी पारित नहीं की जा रही है मैं एक सम्मिलन प्रकार पर काम कर रहा हूं और मुख्य रूप से मेरी सरणी() को केवल आंशिक रूप से क्रमबद्ध करने के लिए पारित किया जाता है()। नीचे स्निपेट से पता चलता है कि test मुख्य() में मूल्य {2, 1, 3, 1, 2} है, लेकिन arr क्रम में() में मूल्य {2, 1} है। यहाँ क्या चल रहा है?सी

#include <stdio.h> 

int sort(int* arr) { 
     int i = 0; 
     int j, key; 
     int count = 0; 

     printf("Inside sort(): "); 
     for (j = 0; j < sizeof(arr)/sizeof(int); ++j) 
      printf("%d ", arr[j]); 
     printf("\n"); 

     for (j = 1; i < sizeof(arr)/sizeof(int); ++j) { 
      key = arr[j]; 
      i = j - 1; 
      while (i >= 0 && arr[i] > key) { 
       arr[i + 1] = arr[i]; 
       --i; 
       ++count; 
      } 
      arr[i + 1] = key; 
     } 
     return count; 
} 

int main(int argc, char* argv) { 
     int test[] = {2, 1, 3, 1, 2}; 
     int i = 0; 
     printf("Inside main(): "); 
     for (i = 0; i < sizeof(test)/sizeof(int); ++i) 
      printf("%d ", test[i]); 
     printf("\n"); 
     int count = sort(test); 
} 
+0

इस से सीखने का सबक सरणी के आकार को उस फ़ंक्शन पर पास करना है जिसे आप बुला रहे हैं। फ़ंक्शन को सरणी के आकार को निर्धारित करने की कोशिश न करें। सामान्य रूप से, फ़ंक्शन आकार निर्धारित नहीं कर सकता है। कुछ चयनित विशेष मामलों में, यह संभव है (उदाहरण के लिए, पॉइंटर्स की सरणी के अंत में एक शून्य सूचक है)। यह कोई दुर्घटना नहीं है कि 'मुख्य()' के लिए तर्क सूची 'int main (int argc, char ** argv) है, भले ही यह उन विशेष मामलों में से एक है जहां शून्य सूचक का अंत निर्धारित करने के लिए उपयोग किया जा सकता है तर्कों की सूची में से। –

+0

संभावित डुप्लिकेट [आकार को कैसे ढूंढें (एक सरणी को इंगित करने वाला पॉइंटर)] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an- सरणी) –

उत्तर

10

मुहावरा sizeof(arr)/sizeof(int) केवल केवल गुंजाइश है कि उन्हें परिभाषित करता है के भीतर स्थिर-आवंटित सरणियों के लिए काम करता है, और।

दूसरे शब्दों में, आप की तरह सरणियों के लिए उपयोग कर सकते हैं:

int foo[32]; 

... गुंजाइश जिसमें वे परिभाषित कर रहे हैं में। लेकिन कहीं और नहीं, और सरणी के लिए नहीं, बस पॉइंटर्स के रूप में पारित किया। अन्य मामलों के लिए, आपको सरणी में तत्वों की अपेक्षित संख्या को इंगित करने वाली अतिरिक्त जानकारी के साथ गुजरना होगा।

+3

तो 'int sort (int * arr, int size)' की तरह कुछ? – BrewerHimself

+3

असाधारण। या बेहतर 'size_t आकार' – wildplasser

+1

@ ब्रेवरहिम स्वयं हाँ, यह ठीक काम करेगा :) बस 'आकार' बाइट्स या निहित तत्वों की संख्या में सरणी का आकार है या नहीं। – reuben