2012-05-17 20 views
7

मेरे पास एक बफर है और यह देखने के लिए एक परीक्षण करना चाहता है कि बफर की पर्याप्त क्षमता है या नहीं। बफर में जोड़े जा सकने वाले तत्वों की संख्या पाएं।आवंटित सी बफर के आकार का निर्धारण कैसे करें?

char *buffer = (char *)malloc(sizeof(char) * 10); 

कर एक

int numElements = sizeof(buffer); 

10 वापस नहीं करता है, मैं यह कैसे पूरा कर सकते हैं पर कोई विचार?

उत्तर

3

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

11

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

6

चूंकि buffer एक सूचक (एक सरणी नहीं) है, sizeof ऑपरेटर एक सूचक का आकार देता है, न कि बफर के आकार को इंगित करता है। इस आकार निर्धारित करने के लिए कोई मानक तरीका यह

char *p = "hello, world\n"; /* sizeof p is not 13. */ 

दिलचस्प बात यह है के लिए एक ही है, नहीं है, इसलिए आपको बस इतना करना अपने आप बहीखाता है (यानी याद है कि आप कितना आवंटित।)

Btw,

sizeof "hello, world\n" 

है 14. क्या आप अनुमान लगा सकते हैं क्यों?

+12

क्या आप वास्तव में प्रश्नकर्ता पर एक प्रश्न पूछ रहे हैं? यह वास्तव में हम क्यों नहीं हैं ... – Evert

+0

@ जेन्स वेल मुझे पता है कि आकार() स्ट्रिंग अक्षर और सरणी के लिए सही आकार देता है, लेकिन क्यों? आकार की जानकारी कहां संग्रहीत की जाती है? उदाहरण के लिए char * p = "हैलो" पॉइंटर का आकार देता है, char p [10] दस का आकार देता है। – Zebrafish

+0

@Evert हम उत्तर पाने के लिए यहां हैं, और उन्होंने एक जवाब दिया। फॉलोअप प्रश्न देना एक वैध शिक्षा उपकरण है।इसके अलावा मुझे नहीं लगता कि उनका प्रश्न आलोचना की गारंटी देता है क्योंकि उनके प्रश्न का उत्तर वह उत्तर है जो उसने अभी दिया है, इसलिए वह वास्तव में जानकारी छुपा नहीं रहा है। मुझे लगता है कि कोई "पाठक के लिए एक व्यायाम" आदि को छोड़कर प्रभावकारिता या मूल्य पर बहस कर सकता है, लेकिन इस मामले में यह काफी संक्षिप्त और प्रासंगिक है। –

0
struct buffer 
{ 
    void 
    *memory 

    size_t 
    length; 
}; 

void *buffer_allocate(struct buffer *b, size_t length) 
{ 
    assert(b != NULL); 

    b->memory = malloc(length) 
    b->length = length; 

     // TRD : NULL on malloc() fail 
     return(b->memory); 
} 

int buffer_valid(struct buffer *b, size_t length) 
{ 
    assert(b != NULL); 

    if(b->memory == NULL or length > b->length) 
    return(0); 

    return(1); 
} 

void *buffer_get(struct buffer *b) 
{ 
    assert(b != NULL); 

    return(b->memory); 
} 

एपीआई का उपयोग करें और malloc/free नहीं और आप गलत नहीं जा सकते हैं।

+0

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

+0

मुझे यकीन नहीं है कि चालाक है - इसका मतलब है कि आपका व्यक्तिगत मॉलोक अब हर किसी के लिए अपने व्यवहार में भिन्न है। मैं कोर फ़ंक्शन व्यवहार समायोजित करने के दृश्य में आया हूं जोखिम भरा है। यह सब कुछ अंडरपिन करता है। –

+1

मुझे एक कंपनी, ओवर-रोड मैलोक पता था ताकि आवंटित सब कुछ फ्रीलिस्ट पर चला गया, और मुफ्त में केवल फ्रीलिस्ट को तत्व लौटा दिया। यह आश्चर्यजनक है कि यह क्या करता है और वास्तव में यह भी लागू किया गया था कि यह कैसे लागू किया गया था (आश्चर्य की बात नहीं है, यह विचार कितना बुरा है) और कोड में इतनी गहराई से एम्बेडेड किया गया है, इसे कभी भी हटाया नहीं जा सकता है। –

0

आकार का उपयोग वास्तविक वस्तुओं के आकार की गणना करने के लिए किया जाता है, स्मृति में वस्तुओं के लिए पॉइंटर्स नहीं। यह structs या primitives का आकार देता है। मेरा मतलब है कि यह काम करेगा, लेकिन आपको पॉइंटर का आकार देगा, न कि जिस संरचना को इंगित करता है।

strlen (बफर)

+0

स्ट्रेलन() का उपयोग केवल तारों पर काम करता है (यानी एक एनयूएल-बाइट के साथ समाप्त होता है)। आम तौर पर, आप "strlen' को" किसी भी प्रकार की सरणी की लंबाई "देने की अपेक्षा नहीं कर सकते हैं। असल में यह दूसरा तरीका है: 'sizeof' ** ** आपको किसी भी प्रकार की सरणी का आकार देता है। – Jens

+0

तो, सही तरीका होगा: sizeof (* बफर)? – SpaceBear

+0

नहीं, क्योंकि घोषणा 'char * buffer' है,' sizeof * buffer' 'sizeof char' है जो 1 है। गतिशील रूप से आवंटित बफर के आकार को निर्धारित करने का कोई तरीका नहीं है, यह याद रखने के अलावा कि आप malloc/calloc कहलाते हैं/realloc। लेकिन ** सरणी ** घोषित किया गया है जैसे 'char foo [N] '' sizeof foo' 'n' है। – Jens

19

जीएनयू glibc के लिए::

SYNOPSIS 

#include <malloc.h> 
size_t malloc_usable_size (void *ptr); 

वर्णन

malloc_usable_size() फ़ंक्शन सरणी उपयोग की किसी भी तरह की लंबाई प्राप्त करने के लिए पीआरटी द्वारा इंगित ब्लॉक में प्रयोग योग्य बाइट्स की संख्या लौटाता है, मॉलोक (3) द्वारा आवंटित स्मृति के ब्लॉक के लिए एक सूचक एक संबंधित समारोह।

+0

नोट: इससे गंभीर उपरि का कारण बन सकता है क्योंकि यह मॉलोक कार्यान्वयन पर निर्भर करता है। और यह आवंटित बाइट्स देता है। उपलब्ध तत्वों की संख्या प्राप्त करने के लिए आपको एक अतिरिक्त विभाजन की आवश्यकता है। आदमी स्पष्ट रूप से कहता है "malloc_usable_size() द्वारा लौटाया गया मान संरेखण और न्यूनतम आकार की बाधाओं के कारण आवंटन के अनुरोधित आकार से अधिक हो सकता है। हालांकि अतिरिक्त बाइट्स को बिना किसी प्रभाव के आवेदन द्वारा ओवरराइट किया जा सकता है, ** यह अच्छा नहीं है प्रोग्रामिंग अभ्यास **: आवंटन में अतिरिक्त बाइट्स की संख्या अंतर्निहित कार्यान्वयन पर निर्भर करती है। " – Stargateur