2013-04-02 9 views
14

मुझे एक पॉइंटर सरणी की लंबाई खोजने में परेशानी हो रही है। मान लीजिए कि मैं दो:सी ++ पॉइंटर सरणी की लंबाई कैसे प्राप्त करें?

char array[40] = "hello"; // size 40 
int length = sizeof array/sizeof array[0]; // no problem returns 40 

// कैसे मुझे लगता है कि सरणी में पहला तत्व के लिए केवल एक सूचक के साथ सरणी की लंबाई मिलता है?

char* pchar = array; 

// अगर

std::strlen(pchar); // this returns the length of 5... i want length 40 

// अगर

int count = 0; 
while(true) 
{ 
    if(*(pchar + count) == '\0') // returns 5... 
    break; 
    count++; 
} 

मैं कैसे यह सरणी में पहला तत्व करने के लिए सिर्फ एक सूचक से लंबाई 40 वापस जाने के लिए मिलता है?
मैंने पाया कि मैं यह कर सकता हूं।

int count = 0; 
    while(true) 
    { 
     if(*(pchar + count) == '\0' && *(pchar + count + 1) != '\0') 
      break; 

     count++; 
    } 

यह रिटर्न 39 है, यह अच्छा है लेकिन मुझे लगता है कि यह कुछ स्थितियों में छोटी हो सकती है।

+13

आप एक सूचक से एक सरणी की लंबाई नहीं मिल सकता है (आपके उदाहरणों या कुछ और हटाने जैसे)

struct { int* int_Array; int array_Size; } 

इस तरह, आप करने के लिए जो कुछ भी आप चाहते हैं कर सकते हैं: की तरह थोड़ा सा। – juanchopanza

+0

हैक्स हैं, लेकिन ऐसा करने के लिए कोई अंतर्निहित तरीका नहीं है। – ApproachingDarknessFish

उत्तर

15

आप नहीं कर सकते, मुझे डर है। आपको किसी भी व्यक्ति को सरणी की लंबाई पारित करने की आवश्यकता है। या आप std::array या std::vector या इसी तरह का उपयोग कर सकते हैं, जो लंबाई को ट्रैक रखता है।

+0

हम्म लेकिन कोड का मेरा अंतिम ब्लॉक 39 लौटा, +1 = 40. यह बुरा क्यों है? –

+0

@JavaNewb: आप सरणी के अंत को अपरिभाषित स्मृति में पढ़ रहे हैं, जो किसी दुर्घटना का कारण बन सकता है। – RichieHindle

3

आप नहीं कर सकते। और नैतिक है, पॉइंटर्स और सरणी का उपयोग न करें, वैक्टर का उपयोग करें। आप हमेशा एक वेक्टर का आकार प्राप्त कर सकते हैं।

3

यह सच है कि आप एक सूचक से सरणी के तत्व को सरणी के तत्व में नहीं प्राप्त कर सकते हैं।

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

void foo (T *p) { 
    // p is a pointer to T 
} 

तो आप सरणी आकार पाने के लिए के बजाय एक टेम्पलेट समारोह का उपयोग कर सकते समारोह में।

std::string

जिसे आप यहां से सहायक हो सकता:

template <unsigned N, typename T> 
void foo (T (&p)[N]) { 
    // p is a reference to an array[N] of T 
    std::cout << "array has " << N << " elements" << std::endl; 
    std::cout << "array has " 
       << sizeof(p)/sizeof(p[0]) 
       << " elements" 
       << std::endl; 
} 

int main() 
{ 
    int array[40]; 
    char array2[25]; 
    foo(array); 
    foo(array2); 
    return 0; 
} 
+0

+1, हां, तो पूरा उत्तर होगा: आप सूचक से सरणी आकार को सरणी में नहीं प्राप्त कर सकते हैं, लेकिन यदि यह किसी फ़ंक्शन में किसी सरणी को पॉइंटर पास करने के बजाय एक विकल्प है, तो आप किसी सरणी के संदर्भ को पार कर सकते हैं और तो आप इस उत्तर से कोड का उपयोग कर आकार प्राप्त कर सकते हैं – stefanB

5

सी ++ उचित स्ट्रिंग प्रकार है। भले ही आप इसे const char* स्वीकार करने वाले फ़ंक्शन पर पास कर रहे हों, फिर भी .c_str() विधि है जो आपको इसे एक सूचक को स्वीकार करने के लिए पास करने की अनुमति देती है। यदि अन्य फ़ंक्शन को स्ट्रिंग को संशोधित करने की आवश्यकता है, तो आप &str[0] का उपयोग कर सकते हैं जो C++ के कई कार्यान्वयन के लिए मान्य है, और C++ 11 के लिए काम करने की आवश्यकता है। बस सुनिश्चित करें कि आप सही आकार में() उन्हें आकार दें।

सी ++ में अन्य कंटेनरों से कुछ हैं:

std::array (सी ++ 11) लगातार आकार की सरणी। सादे पुराने सी सरणी से बेहतर, क्योंकि इसमें size() विधि है। std::vector गतिशील सरणी (जावा ArrayList समतुल्य)

आपके प्रश्न के लिए - एक बिंदु वाले सरणी के आकार को खोजने का कोई तरीका नहीं है। आप यह कैसे कर सकते हैं? यह सिर्फ एक बेवकूफ सूचक है।

+0

** भले ही आप इसे फ़ंक्शन * पर स्वीकार करने वाले फ़ंक्शन पर पास कर रहे हों, इसके पास .c_str() विधि है जो आपको इसे पॉइंटर स्वीकार करने वाले फ़ंक्शन को पास करने की अनुमति देती है। ** ==> यह गलत है। 'C_str()' सदस्य फ़ंक्शन एक 'कॉन्स्ट char * 'देता है। –

+0

@HappyGreenKidNaps आप सही हैं। वह मेरी निगरानी यहाँ थी। – milleniumbug

0

यदि आप सरल रखना चाहते हैं और #include <array.h> का उपयोग नहीं करते हैं, तो आप एक संरचना बना सकते हैं जहां आप सरणी आकार हैं।

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