सी

2010-09-12 4 views
5

में गतिशील रूप से आवंटित दो आयामी सरणी की लंबाई कैसे प्राप्त करें प्रश्न यह है कि सी में गतिशील आवंटित 2 डी Arrays की लंबाई कैसे प्राप्त करें? मैंने सोचा कि नीचे दिए गए कोड को पंक्तियों की संख्या मिलनी चाहिए, लेकिन ऐसा नहीं है।सी

char** lines; 
/* memory allocation and data manipulation */ 

int length; //the number of rows 

length = sizeof(lines)/sizeof(char*); 

इस पर कोई विचार?

उत्तर

6

आपको सी (2 डी या अन्यथा) में गतिशील आवंटित सरणी की लंबाई नहीं मिल सकती है। यदि आपको उस जानकारी की आवश्यकता होती है तो उसे एक चर (या कम से कम एक गणना करने का तरीका) पर सहेजें जब स्मृति प्रारंभ में आवंटित की जाती है और पॉइंटर को स्मृति में और स्मृति के आकार को एक साथ पास कर देती है।

sizeof ऊपर अपने परीक्षण मामले में lines के प्रकार के आकार लौटा रहा है, और इस तरह अपने लंबाई गणना sizeof(char**)/sizeof(char*) के बराबर है और 1 की तुच्छ परिणाम है, हमेशा की संभावना है।

0

आप इसे अपने मूल्य के साथ पास करते हैं। इसे खोजने का कोई तरीका नहीं है।

1

आप सी

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

उदाहरण के लिए:

int length = ...; 
lines = malloc(length*sizeof(char*)); 

आप अन्य कार्यों के लिए चारों ओर इस पारित करने के लिए की जरूरत है, आप या तो उन्हें अलग पैरामीटर के रूप में पारित, या एक struct प्रकार है कि लंबाई और lines सूचक भी शामिल है परिभाषित करने के लिए की आवश्यकता होगी।

2

आपको आवंटित आवंटित सरणी का आकार नहीं मिल रहा है। यदि आपको इस सरणी को फ़ंक्शन में पास करने की आवश्यकता है, तो सरणी और उसके आकार वाली संरचना बनाएं।

struct Line { 
    char** text; 
    uint32_t size; 
}; 
2

malloc या new की अंतर्निहित कार्यान्वयन अनिवार्य रूप से स्मृति अपने चर के लिए आवंटित के आकार का ट्रैक रखने चाहिए। दुर्भाग्यवश, आवंटित ब्लॉक के आकार को पाने का कोई मानक तरीका नहीं है। कारण इस तथ्य के कारण है कि सभी मेमोरी ब्लॉक को गतिशील रूप से आवंटित नहीं किया जाता है, इसलिए केवल उस गतिशील आवंटन के लिए काम करने वाला फ़ंक्शन इतना उपयोगी नहीं होता है।

void fillwithzero(int* array) { 
    unsigned int size = getsize(array); // return 0 for statically allocated array ?? 
    for(int i = 0; i < size; i++) { 
     array[i] = 0; 
    } 
} 

हम कहते हैं कि हम getsize समारोह है कि करने में सक्षम है की जादुई गतिशील आवंटित सरणी के आकार मिल करते हैं। हालांकि, यदि आप किसी स्थिर सरणी के पॉइंटर भेजते हैं, या अन्य सरणी (उदा। बाहरी फ़ंक्शन) द्वारा आवंटित कुछ सरणी fillwithzero पर भेजते हैं, तो यह फ़ंक्शन काम नहीं करेगा। यही कारण है कि अधिकांश सी फ़ंक्शन जो सरणी को स्वीकार करता है, सरणी के आकार के साथ सरणी के आकार या अधिकतम आकार को भेजने के लिए कॉलर आवश्यक होता है।

0

आप गतिशील रूप से आबंटित स्मृति की लंबाई प्राप्त कर सकते हैं, यदि आप NONPORTABLE MSVC/MinGW एक्सटेंशन का उपयोग:

#include <malloc.h> 
char *m = malloc(1234); 
#ifdef __int64 
printf("m size = %lu bytes", _msize(m)); 
#endif