c - सी में, कुछ लोग इसे मुक्त करने से पहले सूचक को क्यों डालते हैं?




pointers casting (4)

मैं एक पुराने कोड आधार पर काम कर रहा हूं और बहुत ज्यादा मुफ्त () के हर मंगलाचरण का उपयोग करता है। उदाहरण के लिए,

free((float *)velocity);
free((float *)acceleration);
free((char *)label);

जहाँ प्रत्येक सूचक इसी (और मिलान) प्रकार का होता है। मुझे ऐसा करने का कोई मतलब नहीं है। यह बहुत पुराना कोड है, इसलिए यदि K & R चीज है तो मैं आश्चर्यचकित रह जाता हूं। यदि हां, तो मैं वास्तव में पुराने कंपाइलरों का समर्थन करना चाहता हूं, जिन्हें इसकी आवश्यकता हो सकती है, इसलिए मैं उन्हें हटाना नहीं चाहता।

क्या इन जातियों का उपयोग करने का कोई तकनीकी कारण है? मैं भी उन्हें उपयोग करने के लिए एक व्यावहारिक कारण के ज्यादा नहीं देखते हैं। इसे मुक्त करने से ठीक पहले डेटा प्रकार की याद दिलाने की बात क्या है?

EDIT: यह प्रश्न अन्य प्रश्न का डुप्लिकेट नहीं है। अन्य प्रश्न इस प्रश्न का एक विशेष मामला है, जो मुझे लगता है कि यदि स्पष्ट मतदाता सभी उत्तरों को पढ़ेंगे तो यह स्पष्ट है।

Colophon: मैं "कांस्ट उत्तर" चेकमार्क दे रहा हूं क्योंकि यह एक वास्तविक कारण है कि ऐसा करने की आवश्यकता क्यों हो सकती है; हालाँकि, इसके बारे में उत्तर पूर्व-एएनएसआई सी प्रथा (कम से कम कुछ प्रोग्रामर के बीच) होने के कारण ऐसा लगता है कि यह मेरे मामले में इस्तेमाल किया गया था। यहाँ बहुत से लोगों द्वारा बहुत सारे अच्छे अंक। आपके योगदानों के लिए धन्यवाद।


पुराना कारण: 1. नि: free((sometype*) ptr) का उपयोग करके, कोड स्पष्ट है कि सूचक को free() कॉल के हिस्से के रूप में माना जाना चाहिए। स्पष्ट कास्ट उपयोगी है जब free() को एक (डू- DIY_free() -खुद) DIY_free() साथ बदल दिया जाता है।

#define free(ptr) DIY_free(ptr, sizeof (*ptr))

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

  1. स्मृति के मुद्दों को ट्रैक करने में बिताए गए कई घंटों को देखते हुए, टाइप फ्रीलाइड को कास्टिंग करने जैसी छोटी ट्रिक डीबगिंग को खोजने और कम करने में मदद करेगी।

आधुनिक: मानस @egur @ और @egur द्वारा संबोधित के रूप में @egur और volatile चेतावनियों से बचना। सोचा था कि मैं 3 क्वालीफायर के प्रभावों को नोट करूंगा: const , volatile और restrict

[संपादित करें] char * restrict *rp2 जोड़े char * restrict *rp2 प्रति @R को char * restrict *rp2 .. टिप्पणी करें

void free_test(const char *cp, volatile char *vp, char * restrict rp, 
    char * restrict *rp2) {
  free(cp);  // warning
  free(vp);  // warning
  free(rp);  // OK
  free(rp2);  // warning
}

int main(void) {
  free_test(0,0,0,0);
  return 0;
}

पूर्व-मानक सी में कोई void* नहीं था, लेकिन केवल char* , इसलिए आपको पास किए गए सभी मापदंडों को डालना होगा। यदि आप प्राचीन C कोड में आते हैं, तो आप इस तरह की जातियाँ पा सकते हैं।

संदर्भ के साथ इसी तरह का सवाल

जब पहला सी मानक जारी किया गया था, तो मॉलोक के लिए प्रोटोटाइप और मुफ्त में char* से void* बदल गया था कि वे आज भी हैं।

और निश्चित रूप से मानक सी में, इस तरह की जातियां बहुत अधिक हैं और पठनीयता को नुकसान पहुंचाती हैं।


यदि संकलक हैं तो संकलक चेतावनी को हल करने के लिए कास्टिंग की आवश्यकता हो सकती है। यहाँ एक कोड का उदाहरण दिया गया है, जो बिना किसी तर्क के चेतावनी देता है:

const float* velocity = malloc(2*sizeof(float));
free(velocity);

और कंपाइलर (जीसीसी 4.8.3) कहता है:

main.c: In function main’:
main.c:9:5: warning: passing argument 1 of free discards const qualifier from pointer target type [enabled by default]
     free(velocity);
     ^
In file included from main.c:2:0:
/usr/include/stdlib.h:482:13: note: expected void *’ but argument is of type const float *’
 extern void free (void *__ptr) __THROW;

यदि आप free((float*) velocity); उपयोग करते free((float*) velocity); संकलक शिकायत करना बंद कर देता है।


यहाँ एक उदाहरण दिया गया है जहाँ मुफ्त में कलाकारों के बिना असफल होंगे:

volatile int* p = (volatile int*)malloc(5 * sizeof(int));
free(p);        // fail: warning C4090: 'function' : different 'volatile' qualifiers
free((int*)p);  // success :)
free((void*)p); // success :)

C में आपको एक चेतावनी मिल सकती है (VS2012 में एक मिला)। C ++ में आपको एक त्रुटि मिलेगी।

दुर्लभ मामलों में एक तरफ, कास्टिंग सिर्फ कोड को फुला देता है ...

संपादित करें: मैंने विफलता को प्रदर्शित करने के लिए void* नहीं void* । यह उसी तरह काम करेगा जैसे int* void* परिवर्तित हो जाएगा void* निहित। जोड़ा गया int* कोड।






casting