2009-10-25 15 views
14

इस सी कोड को देखते हुए जीसीसी के साथ संकलित 4.3.3malloc स्मृति बाहर शून्यिंग? malloc स्मृति बाहर के शून्यीकरण

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


int main(int argc, char * argv[]) 
{ 

    int * i; 

    i = (int *) malloc(sizeof(int)); 

    printf("%d\n", *i); 
    return 0; 

} 

मैं उत्पादन जो कुछ स्मृति में किया गया था कि malloc() रिटर्न, लेकिन इसके बजाय उत्पादन 0. है होने की अपेक्षा करेंगे है यह वापस आता है? यदि हां, तो क्यों?

+3

क्या यह डिबग या रिलीज़ है? – ChrisF

+0

आप क्या उम्मीद करते हैं। यह स्मृति में जो भी था, वह आउटपुट करता है जो malloc() रिटर्न देता है, जो शून्य होता है। –

उत्तर

30

malloc स्वयं स्मृति को शून्य नहीं करता है लेकिन यह कई ऑपरेटिंग सिस्टम स्मृति कारणों को शून्य करेगा जो आपके प्रोग्राम सुरक्षा कारणों से अनुरोध करता है (एक प्रक्रिया को किसी अन्य प्रक्रिया द्वारा उपयोग की जाने वाली संभावित संवेदनशील जानकारी तक पहुंचने के लिए)।

+0

धन्यवाद, यह मुझे विशिष्ट उत्तर देखने के लिए कहीं और देता है! – endeavormac

+6

मुझे यह उल्लेख करना चाहिए कि मानक * में कुछ भी नहीं * malloc को इसकी स्मृति को शून्य करने से रोकता है। दक्षता के लिए, यह * आमतौर पर * नहीं करता है लेकिन यह अनिवार्य नहीं है। – paxdiablo

+15

यह भी ध्यान रखें कि ओएस से नई मेमोरी शून्य हो सकती है, यदि आपका एप्लिकेशन मेमोरी को रीसायकल करता है जो पहले इस्तेमाल कर रहा था तो यह संभवतः _not_ शून्य होने की संभावना है। तो इस पर भरोसा करने के बारे में भी मत सोचो :) – bdonlan

7

malloc() फ़ंक्शन आवंटित स्मृति को किसी विशिष्ट मान पर सेट नहीं करता है। यदि आप यह सुनिश्चित करना चाहते हैं कि स्मृति शून्य है, तो calloc() या समकक्ष का उपयोग करें। अन्यथा, आप जो भी पहले वहां थे वह प्राप्त करें (जो आपके मामले में शून्य हो सकता है)।

+0

मैं उम्मीद करता हूं कि, यदि यह लगातार नहीं था 0. मुझे एक ऐसा मूल्य क्यों मिलेगा जो लगातार 0 है, बार-बार? – endeavormac

+2

आप वही प्रोग्राम बार-बार चल रहे हैं और विभिन्न परिणामों की उम्मीद कर रहे हैं? हालांकि 'malloc()' को स्मृति को शून्य करने की गारंटी नहीं है, ओएस आपके प्रोग्राम को लोड करने और इसे चलाने के लिए एक ही काम कर रहा है। आपका रनटाइम लाइब्रेरी कोड हीप मेमोरी सेट अप करने और अपना कोड चलाने शुरू करने के लिए एक ही काम कर रहा है। जैसा कि एक और उत्तर में बताया गया है, ओएस आपको एक दूसरे से अलग प्रक्रियाओं को अलग करने के लिए, कुछ विशिष्ट मूल्यों के लिए शुरू किए गए नए मेमोरी पेज देने की संभावना है। –

+0

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

1

आप निश्चित रूप से 0 पर निर्भर नहीं हो सकते हैं। malloc एक बड़ा हिस्सा है और इसे देखने के लिए डंप करें।

1

आवंटित स्मृति में मान आधिकारिक रूप से अपरिभाषित है। सी 99 राज्य: The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc() जो कुछ भी चाहता है वह कर सकता है, जिसमें इसे शून्य करना शामिल है। यह जानबूझकर हो सकता है, कार्यान्वयन का साइड इफेक्ट, या आपके पास बहुत सारी मेमोरी हो सकती है जो 0

ऐप्पल के जीसीसी 4.0.1 के साथ ओएस एक्स पर एफडब्ल्यूआईडब्ल्यू मैं इसे बाहर नहीं कर सकता 0 भी बहुत सारे आवंटन नहीं कर रहे हैं:

for(idx = 0; idx < 100000; idx++) { 
    i = (int *) malloc(sizeof(int)); 
    printf("%d\n", *i); 
} 
+0

* i nonzero को सेट करने का प्रयास करें, मुझे मुक्त करें, फिर फिर से mallocing और देखें कि आप क्या प्राप्त करते हैं। –

+0

सुरक्षा प्रक्रियाओं के लिए पहली बार आपकी प्रक्रिया में आवंटित की गई कोई भी स्मृति शून्य पर सेट की जाएगी, ताकि आप स्मृति को मॉलोकॉल नहीं कर सकें और यह पता लगा सकें कि दूसरी प्रक्रिया ने कौन सी जानकारी लिखी है। – gnasher729

+0

@ gnasher729 यह हो सकता है कि एक विशेष सी कंपाइलर क्या करता है, लेकिन * कोई गारंटी नहीं है * यह मामला है और इस पर भरोसा नहीं किया जाना चाहिए। – Schwern

2

मॉलोक को स्मृति भरने की आवश्यकता नहीं है। प्रदर्शन कारणों से, रिलीज संस्करण अक्सर स्मृति के साथ कुछ भी नहीं करते हैं। एक "सुरक्षित" लाइब्रेरी में एक मॉलोक कार्यान्वयन हो सकता है जो स्मृति को साफ़ करता है। यह पुस्तकालय कार्यान्वयन पर निर्भर है। कुछ सामान्य पैटर्न हैं जो विभिन्न संकलक के डीबग पुस्तकालयों द्वारा स्मृति में भरे हुए हैं जो explained in this stackoverflow topic हैं।

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