2009-10-15 20 views
5

के डेटा का आकार मैं क्रम में निम्न कोड की कोशिश की है कि कैसे एक सूचक की डेटा का आकार पाने के लिए देखने के लिए:हो रही है एक सूचक

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

int main(){ 
    char *test_char_ptr = "This is just a test"; 
    int *test_int_ptr = (int *) malloc(16*sizeof(int)); 
    for(int i = 0; i<16; i++){ 
    test_int_ptr[i] = i; 
    } 
    printf("%s\n",test_char_ptr); 
    printf("Test char 1: %d\n", (int)sizeof test_char_ptr); 
    printf("Test char 2:%d\n", (int)sizeof *test_char_ptr); 
    printf("Test char 3: %d\n", (int)((strlen(test_char_ptr)+1) * sizeof(char))); 
    printf("Test int 1:%d\n", (int)sizeof test_int_ptr); 
    printf("Test int 2:%d\n", (int)sizeof *test_int_ptr); 
    return EXIT_SUCCESS; 
} 

और कोड का उत्पादन होता है (32 बिट जीसीसी 4.3 पर) :

This is just a test 
Test char 1: 4 
Test char 2:1 
Test char 3: 20 
Test int 1:4 
Test int 2:4 

मुझे लगता है कि sizeof सोचा (* test_char_ptr) मेरे sizeof डेटा * test_char_ptr के अंदर देना होगा। लेकिन इसके बजाय यह मुझे 1 दिया, जो मुझे लगता है कि डेटा के बजाय आकार का आकार है। Test_int_ptr के लिए भी यही है। लंबी कहानी छोटी है, मेरा सवाल यह है कि मैं पॉइंटर या गतिशील रूप से स्मृति आवंटित सरणी के अंदर डेटा का आकार कैसे प्राप्त कर सकता हूं।

+0

चूंकि आपके संपादन में स्ट्रेल() लाइन को बदलने के बाद से मुझे लगता है कि आउटपुट अब मेल नहीं खाता है। –

+0

ठीक है मैंने आउटपुट अपडेट किया। – systemsfault

+0

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

उत्तर

13

ऐसा कुछ नहीं है जो आप स्वयं को जानकारी बनाए रखने के बिना सी में कर सकते हैं। आपने सरणी बनाई हैं, इसलिए आप अपने आकार को एक बिंदु पर जानते थे, आपको बस इसे अपने बारे में ट्रैक रखना होगा। आप किसी भी डेटा संरचना के बिना आपकी मदद करने के लिए डेटा संरचना बना सकते हैं, या सरणी और आकार की जानकारी को ध्यान से बनाए रख सकते हैं।

इसके अतिरिक्त, आपका कोड स्ट्रिंग के आकार को प्राप्त करने के लिए strlen() का उपयोग कर रहा है - सुनिश्चित करें कि आपको याद है कि लौटाए गए आकार में निरर्थक शून्य वर्ण ('\0') शामिल नहीं होगा; स्ट्रिंग स्थिरांक का इन-मेमोरी आकार strlen(string) + 1 है।

+0

यह त्वरित और गंदा परीक्षण कोड था: डी। तो यह सिर्फ एक टाइपो है। – systemsfault

+0

आपको अपनी पोस्ट संपादित करने और इसे साफ़ करने में सक्षम होना चाहिए; अगर ऐसा होता है तो मैं अपने उत्तर को उचित रूप से संशोधित करूंगा। –

+0

यह होने की आवश्यकता नहीं है कि उन्होंने स्मृति आवंटित की। आवंटित स्मृति और अन्य उपप्रणालीओं को जारी/संशोधित करने वाले कुछ फ़ंक्शन हैं। CreateDIBSection उदाहरण है। –

5

sizeof केवल सरणी के पूर्ण आकार को जानता है अगर यह संकलित समय पर स्थिर रूप से जाना जाता है। एक सूचक के लिए, यह स्मृति पते का आकार, यानी 32-बिट पर 8, 64-बिट पर 8 लौटाएगा।

जब आप पॉइंटर्स का उपयोग करते हैं, तो यह आपके ऊपर बताए गए डेटा के आकार को जानने और ट्रैक रखने पर निर्भर करता है। भाषा कार्यान्वयन आपके लिए ऐसा नहीं करेगा जैसे कि यह सरणी के लिए होगा।

+0

मेरा मानना ​​है कि आपने मेरा बयान गलत व्याख्या किया है, या मैंने इसे स्पष्ट रूप से नहीं बताया है। sizeof (* p) 1 हो सकता है, लेकिन आकार (पी) आकार के समान है (शून्य *) – asveikau

+0

@asveikau: अब मैं देख सकता हूं कि मैंने आपको गलत व्याख्या की है। माफ़ कीजिये। – sbi

3

ऐसा करने का कोई मानक तरीका नहीं है। आपको आवंटित स्मृति की लंबाई किसी अन्य चर में रखना है, या 'कंटेनर' का उपयोग करना है जो आपके लिए ट्रैक रखता है।

कुछ प्लेटफ़ॉर्म में आवंटन में बाइट्स की संख्या खोजने के लिए कार्य होते हैं, उदा। AllocSize(ptr) फ़ंक्शन के रूप में सिम्बियन।

5

पॉइंटर उन वस्तुओं की संख्या का ट्रैक नहीं रखता है जो इसे पहले (पहले) बिंदुओं के पीछे आवंटित किए जाते हैं। ऐसा इसलिए है क्योंकि यह नहीं कर सकता: malloc() बस पहले तत्व का पता देता है, और कुछ भी नहीं।

वहां गतिशील आवंटित सरणी के आकार को जानने का कोई तरीका नहीं है। आपको अपने लिए इसका ट्रैक रखना होगा।

2

एक सूचक केवल डेटा कहां से शुरू होता है इंगित करता है। यह डेटा के आकार के बारे में कुछ भी नहीं जानता है।

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