2012-05-23 7 views
5

कोड का पालन है:क्या मैं सी में स्थिर और स्वचालित चर को मुक्त कर सकता हूं?

#include <stdlib.h> 

int num = 3; // Static external variable 
int *ptr = &num; 

int main(void) 
{ 
int num2 = 4; // Automatic variable 
int *ptr2 = &num2; 

free(ptr); //Free static variable 
free(ptr2); //Free automatic variable 

return 0; 
} 

मैं ऊपर कोड को संकलित करने के लिए प्रयास करें और यह काम करता है, मैं free() समारोह में सक्षम दोनों स्थिर चर और भी स्वत: चर मुक्त करने के लिए करता है उत्सुक हूँ? या मूल रूप से यह कुछ भी नहीं करता है?

+1

यह "काम करता है" की पर्याप्त निम्न गुणवत्ता परिभाषा के लिए "काम करता है"। यह एक ही सिस्टम, एक ही कंपाइलर, या विभिन्न संकलन विकल्पों पर भी क्रैश हो सकता है। यह बस ** अपरिभाषित व्यवहार ** है - कुछ भी हो सकता है, यहां तक ​​कि कुछ भी उम्मीद है। – Jens

उत्तर

12

स्मृति आवंटन कार्य (malloc, calloc आदि) द्वारा वापस नहीं एक सूचक पर free() कॉलिंग अपरिभाषित व्यवहार कारण बनता है।
आपके कोड में एक अनिर्धारित व्यवहार है, इसलिए संकलक को आपको इसका कोई निदान देने की आवश्यकता नहीं है और यह कोई व्यवहार दिखा सकता है, यह काम कर सकता है, या क्रैश हो सकता है, या सचमुच कुछ भी कर सकता है।

बस कोड लिखने से बचें जो एक अनिर्धारित व्यवहार का एकमात्र समाधान है।

+0

आप एक पूर्ण सूचक पर मुफ्त() भी कॉल कर सकते हैं, क्योंकि यह परिभाषित व्यवहार है। बस यह सुनिश्चित करें कि आप कभी भी * समान * सूचक पर दो बार मुफ्त() को कॉल न करें। –

+0

अगर मैं दो बार मुक्त करने की कोशिश करता हूं ?? – caramel1995

+0

@ कारमेल 23: आप सभी को एक अनिर्धारित व्यवहार की गारंटी मिल सकती है। –

5

आपको ऐसा नहीं करना चाहिए। free केवल malloc कार्यों के परिवार द्वारा ढेर से आवंटित स्मृति के लिए उपयोग किया जाता है।

num के लिए मेमोरी डेटा सेगमेंट में आवंटित किया गया है और इसे जारी नहीं किया जा सकता है। num2 के लिए मेमोरी main के कॉल स्टैक फ्रेम में आवंटित की गई है और जल्द ही main रिटर्न जारी की जाएगी।

वास्तव में क्या होता है free के कार्यान्वयन पर निर्भर करता है। malloc/free आवंटित और निःशुल्क मेमोरी क्षेत्रों को ट्रैक करने में सहायता के लिए आमतौर पर ढेर में बनाए गए विशिष्ट डेटा संरचनाएं होती हैं। free उम्मीद करता है कि इन डेटा संरचनाओं के स्थान पर कहीं भी इसकी तर्क संरचनाएं होंगी। जब आप इसे एक पॉइंटर पास करते हैं जो malloc-आवंटित ढेर क्षेत्र को इंगित नहीं करता है, तो यह कुछ उपयोगी जानकारी के रूप में कचरा डेटा पर विचार करेगा और कुछ अजीब चीजें करेगा। और आप भाग्यशाली हैं अगर परिणाम सिर्फ एक तत्काल प्रोग्राम दुर्घटना है।

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