2015-01-30 6 views
7

एक समारोहसी: एक स्थैतिक फ़ंक्शन घोषित करने के लिए जो एक गैरस्टिक स्ट्रिंग देता है?

static char *function(...) { ... } 

रूप में घोषित किया जाता है तो यह मतलब यह है कि यह एक nonstatic समारोह है कि एक static char *, या एक स्थिर समारोह है कि एक nonstatic char * रिटर्न देता है?

निम्नलिखित दो कार्यों की तुलना करें। कौन सा सही उपयोग है?

static char *fn1(void) 
{ 
    static char s[] = "hello"; 
    return s; 
} 


static char *fn2(void) 
{ 
    char *s = malloc(6); 
    strcpy(s, "world"); 
    return s; 
} 
+0

'स्थिर चार *' एक प्रकार –

+0

नहीं है दरअसल, 'शून्य' अनावश्यक है और कुछ कंपेलरों को तोड़ देता है। –

+0

@ प्रो। फाल्कन, मुझे लगता है कि कम से कम C89 में 'fn1 (शून्य) 'का अर्थ है कि मैं एक ऐसा फ़ंक्शन घोषित कर रहा हूं जिसमें कोई पैरामीटर नहीं होता है, जबकि' fn1() 'का अर्थ है कि पैरामीटर निर्दिष्ट नहीं हैं (यानी, पुराने में कई बार जब प्रोटोटाइप का विचार आविष्कार नहीं किया गया है)। क्या मै गलत हु? – hbp

उत्तर

8

static फ़ंक्शन पर लागू होता है, न कि इसके रिटर्न प्रकार। इन दोनों कार्यों में सही हैं-अंतर यह है कि s को पहली बार fn1 पर पहली बार कॉल किया जाएगा, और fn1 पर सभी कॉल s साझा करेंगे; जबकि fn2 में, प्रत्येक कॉल पर एक नया s आवंटित किया जाएगा। और चूंकि fn1 और fn2 दोनों static लिंकेज हैं, इसलिए वे अनुवाद इकाई (स्रोत फ़ाइल, लगभग) के लिए निजी होंगे जहां उन्हें परिभाषित किया गया है।

+0

स्पष्ट स्पष्टीकरण के लिए धन्यवाद। – hbp

3

आपकी कार्य परिभाषाएं दोनों सही हैं।

प्वाइंट टू नोट, static यहां फ़ंक्शन को सीमित करने के लिए फ़ंक्शन को सीमित करने के लिए उपयोग किया जाता है, रिटर्न प्रकार निर्दिष्ट नहीं करने के लिए, यानी, इस फ़ंक्शन को उसी फ़ाइल में मौजूद अन्य कार्यों द्वारा उपयोग किया जा सकता है, लेकिन नहीं कुछ अन्य फाइलों में मौजूद फ़ंक्शंस, हालांकि वे बाइनरी बनाने के लिए संकलित और एक साथ जुड़े हुए हों।

+0

स्पष्टीकरण के लिए धन्यवाद। – hbp

3

static समारोह समारोह पर लागू होता है से पहले, नहीं अपने प्रकार (या इसके भी हिस्सा है, वापसी प्रकार की तरह):
इसका मतलब है कि समारोह स्थिर संबंध है, उर्फ ​​अनुवाद इकाई/स्थानीय फ़ाइल है (और इस प्रकार इनलाइन होने की संभावना है)।

दोनों कार्यों सही हैं, हालांकि वे अलग अलग अर्थ विज्ञान है:

  • पहले रिटर्न एक स्थिर सरणी, जिसकी सामग्री संशोधित किया जा सकता करने के लिए एक सूचक। यदि आप ऐसा करते हैं तो सहमति और पुन: प्रवेश के मुद्दों से सावधान रहें।
  • दूसरा कुछ हीप-मेमोरी आवंटित करता है, इसे स्ट्रिंग के साथ प्रारंभ करता है, और उसे वापस देता है। free को याद रखें।
+0

उत्तर के लिए धन्यवाद! – hbp

1

static कीवर्ड जब फ़ंक्शन परिभाषा के साथ उपयोग किया जाता है तो कहता है कि फ़ंक्शन में फ़ाइल स्तर का दायरा है। इसका मतलब है कि फ़ंक्शन का नाम केवल फ़ाइल के भीतर ही दिखाई देता है। फ़ंक्शन परिभाषा में उपयोग किए गए static कीवर्ड फ़ंक्शन नाम दृश्यता को संशोधित करता है और फ़ंक्शन रिटर्न प्रकार को संशोधित नहीं करता है।

तो एक फ़ंक्शन घोषित स्थिर किसी भी प्रकार का प्रकार लौटा सकता है।

फ़ंक्शन बॉडी में परिभाषित एक चर पर static का उपयोग यह इंगित करने के लिए किया जाता है कि चर लोड किया जाता है जब एप्लिकेशन लोड होता है और प्रारंभ होता है। तो यदि आप फ़ंक्शन के भीतर एक चर पर static संशोधक का उपयोग करते हैं, तो फ़ंक्शन कहलाते समय उस चर को स्टैक पर नहीं बनाया जाता है। यह फ़ंक्शन कहलाता है जब यह स्वतंत्र रूप से मौजूद है। हालांकि चर की दृश्यता केवल फ़ंक्शन के भीतर ही है।

आपके उदाहरण में आपके पास एक ऐसा कार्य है जो static चर के पते को वापस कर रहा है। आप यह कर सकते हैं हालांकि आपको समझना होगा कि यह उपयोग थ्रेड सुरक्षित नहीं है।दूसरे शब्दों में फ़ंक्शन को कॉल करने वाले सभी थ्रेड समान स्मृति स्थान पर समान वैरिएबल प्राप्त करेंगे, न कि वेरिएबल का अपना संस्करण।

आपको यह भी समझना होगा कि यदि आप static वैरिएबल का पता वापस लौटते हैं तो आप पुनर्वितरण और पुनरावृत्ति के साथ समस्याएं भी पैदा कर सकते हैं। इसका कारण यह है कि स्टैक पर वेरिएबल्स पुनर्वितरण और पुनरावृत्ति के लिए प्रदान करते हैं क्योंकि प्रत्येक बार फ़ंक्शन कहलाता है, स्टैक में एक नया फ्रेम जोड़ा जाता है, इसलिए प्रत्येक फ़ंक्शन कॉल का अपना स्टैक फ्रेम होता है, इसलिए यह चर का अपना सेट होता है।

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

फ़ाइल के भीतर एक वैश्विक चर पर static संशोधक का उपयोग एक वैश्विक चर बना देगा जो फ़ाइल के भीतर कई कार्यों द्वारा साझा किया जा सकता है। हालांकि फ़ंक्शन नाम पर स्थिर संशोधक का उपयोग करने की तरह, static चर में केवल फ़ाइल स्कोप दृश्यता होगी।

// .. top of a file of C source code 

static int aStaticInt = 0; // a static int that can be shared by all functions in the file but is visible only in the file 
int aNonStaticInt = 0; // a non static int that is visible outside of the file 

static int myStaticFunc (void) 
{ 
    // a function that is visible only within the file 
} 

int myNonStaticFunc (void) 
{ 
    // a function that is visible outside the file as well as inside the file 
} 
+0

पूरी तरह से स्पष्टीकरण के लिए श्रीमान धन्यवाद! – hbp

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

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