char *xyz()
{
char str[32];
strcpy(str,"Hello there!");
return(str);
}
void main()
{
printf("%s",xyz());
}
जब मैं xyz() को कॉल करता हूं, तो क्या यह एक खतरनाक सूचक वापस करेगा? धन्यवादसी लटकते सूचक प्रश्न
char *xyz()
{
char str[32];
strcpy(str,"Hello there!");
return(str);
}
void main()
{
printf("%s",xyz());
}
जब मैं xyz() को कॉल करता हूं, तो क्या यह एक खतरनाक सूचक वापस करेगा? धन्यवादसी लटकते सूचक प्रश्न
हां, यह एक खतरनाक सूचक है। आपका कार्यक्रम अपरिभाषित व्यवहार का आह्वान करता है।
कुछ सिस्टमों पर यह आपके एप्लिकेशन को क्रैश कर सकता है, अन्य पर यह सही तरीके से काम कर सकता है। लेकिन किसी भी तरह से, आपको यह नहीं करना चाहिए।
यह वास्तव में एक लटकते सूचक को वापस कर देगा।
हां। आम तौर पर आपको बस इतना करना सामान्य रूप में हतोत्साहित किया जाता है की कोशिश कर रहे हैं, लेकिन यह है कि यह बजाय अगर आपको बस इतना करना:
static char str[32];
कौन सुनिश्चित करेगा कि यह समारोह बाहर निकलता है के बाद चारों ओर रहता है।
वास्तव में एक सामान्य समाधान नहीं है। –
हाँ! यह सूचक को "हैलो वहाँ" वापस कर देगा! लेकिन चूंकि xyz() ने उस स्मृति को जारी किया है, इसलिए आप यह सुनिश्चित नहीं कर सकते कि स्ट्रिंग अभी भी है इसलिए यह सूचक को लटक रहा है!
हां यह एक खतरनाक सूचक त्रुटि उत्पन्न करेगा।
जब आप xyz(), 32 * sizeof (char) बाइट्स को कॉल करते हैं तो xyz के स्टैक फ्रेम के भीतर स्टैक पर आवंटित किया जाएगा। जब आप xyz() के भीतर काम कर रहे हों, तो आप इन बाइट्स पर संशोधित और काम कर रहे हैं जिन्हें ढेर पर आवंटित किया गया है।
रिटर्न (स्ट्र) कॉल स्ट्रियर सरणी नाम को पॉइंटर के रूप में उपयोग करता है, इसलिए आप वास्तव में पते को स्ट्र सर में वापस कर रहे हैं। एक बार लौटने के बाद, xyz के लिए स्टैक फ्रेम अवांछित है, और स्थानीय स्मृति स्थान जो xyz str के लिए था, अब मान्य नहीं है।
आपके मुख्य कार्य में वापस xyz() (xyz स्टैक फ्रेम में पुराने स्ट्र स्थानीय चर के पते) से वापसी मूल्य अब किसी अन्य फ़ंक्शन, printf पर भेजा गया है। जब printf अपने स्वयं के ढेर फ्रेम उत्पन्न करता है, तो यह वास्तव में उस स्मृति पर लिख रहा होगा जिसे पहले xyz() में स्ट्र को स्टोर करने के लिए उपयोग किया जाता था (क्योंकि यह स्टैक पर अगली उपलब्ध स्मृति है)।
** हाँ ** 1234567 – pmg