मुक्त हो जाता है मैं सी में नया हूँ, सी कि मैं थोड़े उलझनजब सी में सूचक मुक्त करने के लिए और कैसे पता करने के लिए अगर यह
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int a;
} struct1_t;
int main()
{
funct1(); //init pointer
return 1;
}
int funct2(struct1_t *ptr2struct)
{
printf("print a is %d\n",ptr2struct->a);
//free(ptr2struct);
printf("value of ptr in funct2 is %p\n", ptr2struct);
return 1; //success
}
int funct1(){
struct1_t *ptr2struct = NULL;
ptr2struct = malloc(sizeof(*ptr2struct));
ptr2struct->a = 5;
printf("value of ptr before used is %p", ptr2struct);
if (funct2(ptr2struct) == 0) {
goto error;
}
free(ptr2struct);
printf("value of ptr in funct1 after freed is is %p\n", ptr2struct);
return 1;
error:
if(ptr2struct) free(ptr2struct);
return 0;
}
मैं funct 1 है funct कॉल में स्मृति आवंटन के बारे में पता लगाने की कोशिश 2, और funct1 में आवंटित सूचक का उपयोग करने के बाद, मैं सूचक को मुक्त करने का प्रयास करता हूं। और मैं एक मामला बना देता हूं जहां funct2 में वापसी मान 1 नहीं है, तो पॉइंटर को मुक्त करने के लिए फिर से प्रयास करें।
मेरा प्रश्न नीचे
जो अभ्यास के लिए बेहतर है, मैं स्मृति funct2 में मुक्त करता है, तो चाहिए (के बाद मैं इसे पारित) या funct1 में (के बाद मैं funct1 की वापसी मान रही समाप्त करने के बाद) है दूसरी बात यह है कि क्या यह एक गोटो त्रुटि, और त्रुटि बनाने के लिए सही है:
if(ptr2struct) free(ptr2struct);
मेरे तीसरा सवाल है, मैं अगर आवंटित मूल्य पहले से ही मुक्त कर दिया है या नहीं, इसकी जांच करते है? क्योंकि वापसी मूल्य प्राप्त करने के बाद, मैं सूचक को मुक्त करता हूं, लेकिन अगर मैं इसे प्रिंट करता हूं, तो यह आवंटित एक के साथ एक ही स्थान दिखाता है (इसलिए शून्य सूचक नहीं)।
को छोड़कर एक ही चीज़ है, यदि आप एक ही समारोह में आवंटित और मुक्त कर सकते हैं, शायद आपको इसे ढेर पर रखना चाहिए। –
@missingno: इसके लिए, यह सही है: "अगर (ptr2struct) मुक्त (ptr2struct);" या मुझे सिर्फ "मुक्त (ptrstruct) लिखना चाहिए। क्योंकि मुझे लगता है कि ptr2struct एक सूचक है, इसलिए एक बूल वैल्यू नहीं है, क्या मैं रिटर्न वैल्यू सही नहीं होने पर गेटो के अंदर इस नोटेशन का उपयोग कर सकता हूं? धन्यवाद – xambo
@MK: कुछ चीजें (सी 99 से पहले परिवर्तनीय-लंबाई सरणी की तरह) अभी भी मॉलोक-एड होने की आवश्यकता है। फिर भी, एक दूसरे के पास आवंटन और विलोपन रखने की कोशिश कर रहे हैं (अवधारणात्मक रूप से - इसे सख्ती से एक ही कार्य में होने की आवश्यकता नहीं है) आमतौर पर बेहतर होता है। – hugomg