2010-02-14 14 views
11

संभव डुप्लिकेट:
newbie questions about malloc and sizeofका उपयोग sizeof() malloc'd स्मृति पर

मैं एक कार्यक्रम में तार को पढ़ने के लिए कोशिश कर रहा हूँ। जब मैंने देखा है कि तार कभी कभी भ्रष्ट किया जा रहा था, मैं निम्नलिखित कोड की कोशिश की:

void *mallocated = malloc(100); 
printf("sizeof(mallocated) = %d\n", sizeof(mallocated)); 

मेरे कार्यक्रम के अनुसार, mallocated के आकार 8 था, भले ही मैं इसके लिए 100 बाइट्स आवंटित। इस वजह से, जब भी मैं 8 बाइट्स से अधिक स्ट्रिंग को स्टोर करने का प्रयास करता हूं, तो 8 वीं बाइट के बाद सब कुछ गायब हो जाएगा। यह क्यों हो रहा है, और मैं इसे कैसे रोक सकता हूं?

+4

sizeof (mallocated) आप शून्य के आकार दे देंगे * जो अपने 64-बिट सिस्टम पर 8 बाइट है। स्ट्रैपी के साथ, उस चर को स्ट्रिंग कैसे आवंटित करते हैं? – tur1ng

+0

देखें: http://stackoverflow.com/questions/1533519/newbie-questions-about-malloc-and-sizeof – Shog9

+0

आपका निष्कर्ष भी गलत है, 8 वें "बाइट" (बिट नहीं) के बाद लिखा गया कुछ भी यादृच्छिक रूप से गायब नहीं होता कभी कभी। – Blindy

उत्तर

13

क्योंकि "स्ट्रिंग" पॉइंटर का आकार 8 बाइट्स है। अपने उचित "आकार" के साथ sizeof() का उपयोग करने के कुछ उदाहरण यहां दिए गए हैं। Size_of() शब्द कभी-कभी उन लोगों के लिए धोखा दे रहा है जिनका उपयोग करने के लिए उपयोग नहीं किया जाता है। आपके मामले में, सूचक का आकार 8 बाइट्स है .. नीचे एक सामान्य 32-बिट सिस्टम पर एक प्रतिनिधित्व है।

sizeof (char) = 1 
sizeof (double) = 8 
sizeof (float) = 4 
sizeof (int) = 4 
sizeof (long) = 4 
sizeof (long long) = 8 
sizeof (short) = 2 
sizeof (void *) = 4 

sizeof (clock_t) = 4 
sizeof (pid_t) = 4 
sizeof (size_t) = 4 
sizeof (ssize_t) = 4 
sizeof (time_t) = 4 

Source

आप बाहर जा रहे हैं आप कैसे निर्धारित करने कर रहे हैं अपने स्ट्रिंग (चार सरणी) गायब है। यह शायद किसी फ़ंक्शन को पास किया जा रहा है, जिसे आपको स्पष्ट रूप से एक चर के रूप में पारित करने या उसे कहीं ट्रैक करने की आवश्यकता है। Sizeof() का उपयोग करके आपको यह नहीं बताया जाएगा।

इसके बारे में मेरे previous question देखें और आपको प्रारंभिक समझ की कमी भी दिखाई देगी।

+0

सहायता के लिए धन्यवाद। कार्यक्रम के साथ समस्या काफी नहीं थी जो मैंने सोचा था (क्या यह कभी है?) लेकिन आपकी सलाह बहुत उपयोगी थी। –

7

C89 में, sizeof ऑपरेटर केवल एक चर का संकलन समय पर बाइट में (इस मामले में 8 बाइट्स का एक void सूचक) आकार पाता है। यह उस तरीके से काम करता है जिसकी आप सादा सरणी पर काम करने की उम्मीद करेंगे, क्योंकि उनका आकार संकलन समय पर जाना जाता है।

char arr[100]; // sizeof arr == 100 
char *p = arr; // sizeof p == 4 (or 8 on 64-bit architectures) 
char *p = malloc(100); // sizeof p == 4 (or 8). Still! 

ढेर-आबंटित स्मृति के आकार का पता करने के लिए, आप मैन्युअल रूप से यह का ट्रैक रखने की जरूरत है, sizeof आप मदद नहीं करेगा।

+1

यह सच नहीं है। सी 99 में, 'sizeof' एक चर लंबाई लंबाई सरणी का आकार देता है, जो कई मामलों में केवल रनटाइम पर निर्धारित किया जा सकता है। – dreamlax

+0

धन्यवाद, मैंने चीजों को सरल रखने के लिए उत्तर से सी 99 केस को छोड़ दिया। –

7

sizeof पॉइंटर (void *) का आकार देता है जिसे आपने आवंटित स्मृति का आकार नहीं दिया है। यदि आप इसे बाद में उपयोग करना चाहते हैं तो आपको स्मृति के आकार को एक अलग चर में स्टोर करना होगा।

3

आप नहीं कर सकते। जैसा कि बताया गया है, आप void * का आकार प्राप्त कर सकते हैं, लेकिन यह आपको बहुत कुछ नहीं बताता है।

आप malloed *mallocated का आकार प्राप्त नहीं कर सकते हैं। ऐसा कहने के लिए, 100 (आपके उदाहरण में) लौटने के लिए कोई फ़ंक्शन कॉल नहीं है - जब तक कि आप अपनी मेमोरी प्रबंधन दिनचर्या नहीं लिखते।

सरल सिर्फ इसे कहीं याद करने के लिए ... शायद ....

stuct { 
    void *data; 
    unsigned int size 
} myStructureWhichRemebersItsSize; 

myStructureWhichRemebersItsSize *someData; 
someData.data = malloc(100); // and check for NULL 
someData.size = 100; 
+1

"आप मॉलोएड का आकार नहीं प्राप्त कर सकते" ... सच नहीं है, यह आपके सी पुस्तकालयों पर निर्भर करता है। एमएस के सीआरटी एसटीडीआईएलबी के तहत, आप ओपी चाहता है कि "100" प्राप्त करने के लिए बस '_msize (* mallocated)' को कॉल कर सकते हैं। –

+0

+1 जानकारी के लिए धन्यवाद। मैं एमएस का उपयोग नहीं करता, इसलिए उसे नहीं पता था। एक उपयोगी सुविधा जो अधिक स्थानों में देखना अच्छा लगेगा। बेशक, दृश्यों के पीछे संकलक शायद एक संरचना उत्पन्न कर रहा है जैसे कि मैं वर्णन करता हूं। – Mawg

0

void* स्मृति में एक स्थान के प्रकार है अगर तुम नहीं जानते कि यह क्या होता है। इससे बचा जाना चाहिए।

char* एक मान का प्रकार है जो स्मृति में कुछ स्थान को इंगित करता है जिसमें char है। स्मृति में किसी स्थान की पहचान करना आठ बाइट लेता है।

sizeof आपको बताता है कि एक विशेष प्रकार के कितने बाइट्स लेते हैं। malloc के साथ कितने आवंटित नहीं किए गए थे, लेकिन कितना मेमोरी कंपाइलर जानता है कि लेना चाहिए। मूल्यों के लिए sizeof लागू करना अक्सर खराब शैली माना जाता है, और जैसा कि यहां बताया गया है, कभी-कभी C99 में स्मार्ट व्यवहार का आह्वान करता है।

char[100] 100 वर्ण रखने वाले मान के प्रकार। char[100] a; स्टैक पर 100 char एस की एक स्ट्रिंग है।

char(*)[100] 100 वर्ण रखने वाले मान के लिए पॉइंटर का प्रकार है। char(*b)[100];b संभवतः ढेर पर 100 वर्णों को इंगित करता है। क्या आप शायद चाहते

char (*s)[100] = malloc(sizeof(char[100])); 
printf("%u byte pointer to %u bytes of size %u elements\n", 
    sizeof s, sizeof *s, sizeof **s);