जैसा कि पहले के अधिकांश उत्तरों में बताया गया है, यह आपके विशेष मामले में सूचक को func2()
पर पास करने के लिए पूरी तरह से सुरक्षित है।
सॉफ़्टवेयर के असली दुनिया के टुकड़े में हालांकि, मैं इस हानिकारक पर विचार करता हूं क्योंकि आपके पास func2()
पर आपके नियंत्रण के साथ नियंत्रण नहीं है। func2()
बाद में बिंदु पर अतुल्यकालिक रूप से इसका उपयोग करने के लिए इसके पैरामीटर में उपनाम बना सकता है। और उस समय, स्थानीय उपरोक्त int i
चलाया जा सकता है जब यह उपनाम बाद में उपयोग किया जाता है।
तो स्थानीय बिंदु (स्वचालित) चर के लिए एक पॉइंटर पास करने के मेरे दृष्टिकोण से अत्यंत खतरनाक है और इसे टालना चाहिए।
आप ऐसा कर सकते हैं, तो आप के रूप में static int i;
उस मामले में func1()
में चर घोषित, यह सुनिश्चित किया जाता है, कि i
के लिए स्मृति पुनर्नवीनीकरण नहीं हो जाएगी और ओवरराइट। हालांकि आपको एक समवर्ती वातावरण में इस स्मृति में अभिगम नियंत्रण के लिए कुछ म्यूटेक्स लॉकिंग सेट अप करने की आवश्यकता होगी।
इस समस्या को स्पष्ट करने के लिए यहां कुछ कोड है जो मैंने कल अपने ग्राहक पर सॉफ़्टवेयर परीक्षण करते समय ठोकर खाई थी। और हाँ, यह दुर्घटनाओं ...
void func1()
{
// Data structure for NVMemory calls
valueObj_t NVMemObj;
// a data buffer for eeprom write
UINT8 DataBuff[25];
// [..]
/* Assign the data pointer to NV Memory object */
NVMemObj.record = &DataBuff[0];
// [..]
// Write parameter to EEPROM.
(void)SetObject_ASync(para1, para2, para3, &NVMemObj);
return;
}
void SetObject_ASync(para1, para2, para3, valueObj_t *MemoryRef)
{
//[..]
ASyncQueue.CommandArray[ASyncQueue.NextFreeEntry].BufferPtr = MemoryRef->record;
//[..]
return;
}
इस मामले में, DataBuff
में डेटा लंबे जब ASyncQueue.CommandArray[ASyncQueue.NextFreeEntry].BufferPtr
में सूचक EEPROM करने के लिए डाटा स्टोर करने के लिए इस्तेमाल किया जाता है चला गया है।
इस कोड को ठीक करने के लिए, यह कम से कम static UINT8 DataBuff[25];
इसके अतिरिक्त, यह भी static valueObj_t NVMemObj
घोषित करने के लिए हम नहीं जानते कि के रूप में क्या कहा जाता है कि समारोह सूचक के साथ कर रही है विचार किया जाएगा की घोषणा करने के लिए आवश्यक है।
यह संक्षिप्त में कहें: टी एल; डॉ
भले ही यह सी भाषा मैं इसे के रूप में हानिकारक एक समारोह कॉल में स्वत: चर के संकेत पारित करने के लिए पर विचार में कानूनी है। आप कभी नहीं जानते (और अक्सर आप जानना नहीं चाहते हैं) पारित मूल्यों के साथ वास्तव में क्या कहा जाता है। जब बुलाया गया कार्य उपनाम स्थापित करता है, तो आपको बड़ी परेशानी होती है।
बस मेरे 2 सेंट।
वैरिएबल नष्ट होने के बाद एक चर के लिए पॉइंटर का उपयोग करना असुरक्षित है। तुम यहाँ ऐसा नहीं कर रहे हो। – immibis
ओटी: यदि कार्य के लिए कोई तर्क परिभाषित नहीं किया गया है तो यह 'void func1 (शून्य) होना चाहिए। – alk
[संभावित रूप से कार्य करने के लिए ऑटो चर से पॉइंटर को सुरक्षित करने के लिए सुरक्षित?] (Http://stackoverflow.com/questions/17798785/safe-to-pass-pointer-to-auto-variable-to- कार्यक्षमता) – ravron