2012-01-05 15 views
13

मैं निम्नलिखित दो कार्य है कहो पहला वाला (उदाहरण के लिए फ़ंक्शन एक स्थानीय चर का पता देता है) लेकिन मैं kn ow यह अवैध है क्योंकि b ढेर से गायब हो जाता है और हमें अपरिभाषित स्मृति के लिए एक सूचक के साथ छोड़ दिया जाता है।वापसी पता

तो मुझे अस्थायी मूल्य के पते को वापस करने के बारे में सावधान रहने की आवश्यकता कब है?

उत्तर

17

कारण आपको पहली स्निपेट में चेतावनी नहीं मिल रही है क्योंकि आप (स्थानीय कंपाइलर के परिप्रेक्ष्य से) स्थानीय चर में कोई पता नहीं लौट रहे हैं।

आप int * temp के मान को वापस कर रहे हैं। भले ही यह चर हो (और इस उदाहरण में) एक मान है जो एक स्थानीय चर का पता है, संकलक यह देखने के लिए कोड निष्पादन स्टैक ऊपर नहीं जायेगा कि यह मामला है या नहीं।

नोट: के टुकड़े की दोनों समान रूप से खराब हैं, भले ही अपने संकलक पूर्व के बारे में चेतावनी नहीं है। इस दृष्टिकोण का प्रयोग न करें।


तुम हमेशा सावधान जब स्थानीय चर के पते लौटने होना चाहिए; एक नियम के रूप में, आप कह सकते हैं कि आप कभी नहीं चाहिए।

static चर एक अलग मामला है, जिस पर this thread में चर्चा की जा रही है।

+1

धन्यवाद! और तथ्य यह है कि जब मैं मुख्य रूप से रिटर्न वैल्यू प्रिंट करता हूं तो मुझे सही परिणाम मिल जाता है, इसका वास्तव में इसका मतलब है कि यह जंक प्रिंट करता है? – mary

+3

इसका मतलब है कि आप आम तौर पर * [अपरिभाषित व्यवहार] (http://en.wikipedia.org/wiki/Undefined_behavior) *, यानी के रूप में संदर्भित करते हैं। व्यवहार जो मानक में निर्दिष्ट नहीं है। –

-2

ये दोनों खराब हैं, और एक अच्छा संकलक दोनों स्थितियों के बारे में पता लगाने और चेतावनी देने में सक्षम होना चाहिए। चेतावनी स्तर को अधिकतम करने के लिए आपको बेहतर परिणाम मिल सकते हैं (जो आपको हमेशा वैसे भी करना चाहिए), और अनुकूलन चालू करें।

+0

विशिष्ट मामला, शायद। लेकिन ऐसे कई मामले हैं जिनमें पते को अन्य चर से (या अन्य कार्यों के माध्यम से) को हल करना शामिल है, जो कि एक कंपाइलर बस पहचानने में सक्षम नहीं होगा। इसके अलावा, ऑप्टिमाइज़ेशन शायद ही ऐसी समस्या का पता लगाने की संभावनाओं को बढ़ाता है - यह केवल देखने योग्य प्रभाव वाले समस्या का मौका बढ़ाता है। – Rob

+0

बेशक ऐसी स्थितियां हैं जहां संकलक का पता नहीं लगाया जा सकता है, लेकिन इन विशिष्ट मामलों को आसानी से पता लगाना चाहिए। अनुकूलन काम करता है क्योंकि यह दूसरे उदाहरण को कम करता है। – harald

+1

क्षमा करें, सच नहीं है। एक कंपाइलर के कार्यान्वयन की गुणवत्ता की बात आती है तो कुछ "कंधे" होते हैं - ये विक्रेता लागत उनके स्वयं के लागत/लाभ विश्लेषण के आधार पर होते हैं, जो डेवलपर प्रीकॉन्सेप्शन को पूरा नहीं कर सकते हैं। उदाहरणों का निर्माण करना भी बहुत आसान है (उदाहरण के लिए एक फ़ंक्शन कॉल जो पॉइंटर बदल सकता है) जिसका अर्थ है कि आपके द्वारा दावा किया जाने वाला अनुकूलन संभव नहीं हो सकता है - जो कि इस तरह की चीजों को अनुकूलित करने के लिए एक विक्रेता निर्णय भी देता है, न कि दिए गए। – Rob

0

दोनों उदाहरण समान रूप से गलत हैं। मेरा अनुमान है कि आपका कंपाइलर खतरे को नहीं देखता है और इस प्रकार जब आप अस्थायी चर में पता संग्रहीत करते हैं तो चेतावनी जारी नहीं करते हैं।

1

मैं कहूंगा कि आप स्थानीय चर या बदले में पॉइंटर्स को वापस कर सकते हैं जैसे कि यह गतिशील रूप से मॉलोक द्वारा आवंटित किया गया था, उस स्थिति में वेरिएबल को संग्रहीत करने के लिए उपयोग की जाने वाली मेमोरी स्टैक पर होनी चाहिए लेकिन ढेर पर और साफ़ नहीं किया जाएगा या फ़ंक्शन से बाहर निकलने के बाद पुनः उपयोग किया जाता है क्योंकि यह स्वचालित स्थानीय चर के मामले में होता है (मॉलोक के बिना बनाया गया), क्या मैं सही हूँ?

0

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

Here is a simple answer

मैं विशेष रूप से इस जवाब पसंद आया।

Here is an example where this bad practice caused some real hardware damage

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