2011-03-30 11 views
17

संभव डुप्लिकेट:
How to find the sizeof(a pointer pointing to an array)सी sizeof एक पारित कर दिया सरणी

मैं समझता हूँ कि sizeof ऑपरेटर का मूल्यांकन किया और संकलन समय पर एक निरंतर साथ बदल दिया है। यह देखते हुए कि, एक समारोह में एक कार्यक्रम में अलग-अलग बिंदुओं पर अलग-अलग सरणी कैसे पारित की जा सकती हैं, क्या इसका आकार गणना किया गया है? मैं इसे फ़ंक्शन के पैरामीटर के रूप में पास कर सकता हूं, लेकिन अगर मुझे पूरी तरह से नहीं करना है तो मुझे एक और पैरामीटर जोड़ना नहीं होगा।

यहाँ वर्णन करने के लिए मैं क्या पूछ रहा हूँ एक उदाहरण है:

#include <stdio.h> 
#include <stdlib.h> 

#define SIZEOF(a) (sizeof a/sizeof a[0]) 


void printarray(double x[], int); 

int main() 
{ 
     double array1[ 100 ]; 


     printf("The size of array1 = %ld.\n", SIZEOF(array1)); 
     printf("The size of array1 = %ld.\n", sizeof array1); 
     printf("The size of array1[0] = %ld.\n\n", sizeof array1[0]); 

     printarray(array1, SIZEOF(array1)); 

     return EXIT_SUCCESS; 
} 


void printarray(double p[], int s) 
{ 
     int i; 


     // THIS IS WHAT DOESN"T WORK, SO AS A CONSEQUENCE, I PASS THE 
     // SIZE IN AS A SECOND PARAMETER, WHICH I'D RATHER NOT DO. 
     printf("The size of p calculated = %ld.\n", SIZEOF(p)); 
     printf("The size of p = %ld.\n", sizeof p); 
     printf("The size of p[0] = %ld.\n", sizeof p[0]); 

     for(i = 0; i < s; i++) 
       printf("Eelement %d = %lf.\n", i, p[i]); 

     return; 
} 
+0

मानक सी गॉचा - प्रश्न से जुड़े देखें। – Jon

+0

'आकार' को सी 99 में संकलन समय पर मूल्यांकन नहीं किया जाना चाहिए - वीएलए 'आकार' के साथ ठीक से काम करते हैं, और उनका आकार केवल रनटाइम पर ही जाना जा सकता है। –

उत्तर

11

कोई जादू समाधान नहीं है। सी एक प्रतिबिंबित भाषा नहीं है। ऑब्जेक्ट्स स्वचालित रूप से नहीं जानते कि वे क्या हैं।

  1. जाहिर है, एक पैरामीटर
  2. लपेटें एक पैरामीटर
  3. एक अधिक जटिल वस्तु का उपयोग करें जोड़ने के लिए मैक्रो में कॉल जोड़ सकते हैं और स्वचालित रूप से:

    लेकिन आप कई विकल्प होते हैं। एक संरचना को परिभाषित करें जिसमें गतिशील सरणी और सरणी का आकार भी शामिल है। फिर, संरचना का पता पास करें।

1

आप एक प्रहरी मूल्य किस तरफ तार के साथ पेश कर रहे हैं का उपयोग कर सकते हैं। दोष यह है कि आपको अपने आकार को खोजने के लिए पूरे सरणी पर फिर से चलना होगा।

उदाहरण के लिए

, आप एक स्ट्रिंग जैसे जब:

char s1[] = "foobar"; 

क्या आप वास्तव में है सातवें स्थान एक अशक्त समाप्त चार '\ 0' जो इंगित करने के लिए कार्य करता है होने के साथ लंबाई 7 की एक सरणी है, सरणी/स्ट्रिंग का अंत।

एक और तरीका यह है कि आप ऐसा कर सकते हैं एक संरचना बनाने के लिए जिसमें सरणी के बाद आकार होता है।

0

आप या तो

  1. सरणी के आकार एक पैरामीटर के रूप समारोह
  2. सुनिश्चित करें कि सरणी ज्ञात मान के साथ समाप्त होता करने के लिए दर्रा, और बंद करो जब आप उस मूल्य तक पहुंचने चाहिए।
0

यदि आपकी सरणी को समाप्त कर दिया गया है तो आप सरणी के माध्यम से पुनरावृत्त कर सकते हैं और अंतिम मान पा सकते हैं। सी में कई स्ट्रिंग ऑपरेटर इस तरह से काम करते हैं

अन्यथा आपके पास अधिक विकल्प नहीं है।

sizeof पी के आकार है, जो एक सूचक है और इच्छा अपने पूर्णांक आकार के बराबर

6

समारोह मापदंडों वास्तव में सरणी प्रकार की आवश्यकता नहीं है वापस आ जाएगी।जब संकलक देखता

void printarray(double p[], int s) 

या यहाँ तक कि

void printarray(double p[100], int s) 

बदल देता या तो एक

को
void printarray(double* p, int s) 

तो sizeof(p)sizeof(double*) है। और हाँ, आपको आकार को पैरामीटर के रूप में पास करना होगा।

1

आपने अपने प्रश्न का उत्तर दिया। यह संकलन-समय पर गणना की जाती है, तो रनटाइम के दौरान 'sizeof p' संभवतः एक से अधिक मान कैसे हो सकता है?

पैरामीटर के रूप में लंबाई को पास करना एक अच्छा समाधान है, अन्यथा आप सुनिश्चित कर सकते हैं कि आपके सरणी हमेशा कुछ विशेष मूल्य (जैसे स्ट्रिंग्स और नल बाइट) के साथ समाप्त हो जाएं।

5

समस्या यह है कि आपके फ़ंक्शन को सरणी मान प्राप्त नहीं होता है; यह एक सूचक मूल्य प्राप्त करता है।

जब यह sizeof या एकल & ऑपरेटरों के संकार्य है, या यह एक स्ट्रिंग शाब्दिक एक घोषणा में एक और सरणी, प्रकार के "T की सरणी" एक अभिव्यक्ति प्रारंभ करने में इस्तेमाल किया जा रहा है के अलावा "सूचक टाइप करने के लिए परिवर्तित किया जाएगा T "और इसका मान सरणी के पहले तत्व का पता होगा।

इस प्रकार, जब आप printarray फोन, array1 के प्रकार परोक्ष "double के 100-तत्व वाली सरणी" से बदल जाती है "double सूचक।" इस प्रकार, पैरामीटर p का प्रकार double * है, double [100] नहीं।

फ़ंक्शन पैरामीटर घोषणा के संदर्भ में, T a[]T *a के समान है।

यही कारण है कि आपको सरणी आकार को अलग से पास करना होगा;