सवाल क्या मैं मॉलोक का नतीजा डालता हूं?


में यह प्रश्न, किसी ने सुझाव दिया है टिप्पणी मुझे चाहिए नहीं का परिणाम डालो malloc, अर्थात।

int *sieve = malloc(sizeof(int) * length);

बजाय:

int *sieve = (int *) malloc(sizeof(int) * length);

यह मामला क्यों होगा?


2043
2018-03-03 10:13


मूल


इसके अलावा, यह चलनी = malloc लिखने के लिए और अधिक रखरखाव है (आकार * चाकू * लंबाई); - William Pursell
stackoverflow.com/q/7545365/168175 - Flexo♦
@ करोलो हॉर्वथ यह एकमात्र कारण नहीं है। दूसरा (और सबसे महत्वपूर्ण, आईएमएचओ), कोड को अधिक लचीला बनाना है (फिर भी कम सुरक्षित या मजबूत नहीं) यदि प्रकार sieve int से कहें, कहें, फ्लोट करें। malloc( sizeof *sieve * length ); इस प्रकार के बावजूद काम करेगा, जबकि एक कलाकार को रखरखाव की जरूरत है, कुछ भी नहीं जोड़ता है, और बग को ट्रैक करने के लिए कठिन बना सकता है। - MestreLion
@MestreLion: "और बग को ट्रैक करने के लिए कठिन बना सकता है" - आपको बस इतना करना है कि संकलन चेतावनियां सक्षम करें और यह है कभी नहीँ होने वाला है। ओटीओएच अगर आप नहीं करते ... आप वास्तव में इसके लायक हैं। और, फिर से, मैं इसका उपयोग करने का समर्थक नहीं हूं .. मैं बस इतना कह रहा हूं कि यह वास्तव में महत्वपूर्ण नहीं है ... यह है ज्यादातर हानिरहित :) - Karoly Horvath
यह भी देखें विशेष रूप से, परिणाम कास्टिंग के बारे में खतरनाक क्या है malloc()? - Jonathan Leffler


जवाब:


नहीं; आप नहीं परिणाम डालें, क्योंकि:

  • यह अनावश्यक है, जैसा कि void * इस मामले में किसी भी अन्य सूचक प्रकार के लिए स्वचालित रूप से और सुरक्षित रूप से प्रचारित किया जाता है।
  • यह कोड को अव्यवस्था जोड़ता है, कोस्ट पढ़ने के लिए बहुत आसान नहीं है (विशेष रूप से यदि सूचक प्रकार लंबा है)।
  • यह आपको खुद को दोहराता है, जो आम तौर पर खराब होता है।
  • यदि आप शामिल करना भूल गए हैं तो यह एक त्रुटि छिपा सकता है <stdlib.h>। यह दुर्घटनाओं का कारण बन सकता है (या, बदतर, नहीं कोड के कुछ पूरी तरह से अलग हिस्से में बाद में एक दुर्घटना का कारण बनता है)। विचार करें कि क्या होता है यदि पॉइंटर्स और पूर्णांक अलग-अलग आकार में होते हैं; तो आप कास्टिंग करके एक चेतावनी छुपा रहे हैं और आपके लौटे पते के बिट्स खो सकते हैं। नोट: सी 11 निहित कार्यों के रूप में सी से चले गए हैं, और यह बिंदु अब प्रासंगिक नहीं है क्योंकि कोई स्वचालित धारणा नहीं है कि अविकसित फ़ंक्शन वापस आते हैं int

एक स्पष्टीकरण के रूप में, ध्यान दें कि मैंने कहा "आप नहीं डाले", नहीं "आप नहीं करते जरुरत कास्ट करने के लिए "। मेरी राय में, यह कास्ट शामिल करने में विफलता है, भले ही आपको यह सही लगे। इसे करने के लिए कोई लाभ नहीं है, लेकिन संभावित जोखिमों का एक गुच्छा, और कलाकारों सहित इंगित करता है कि आप नहीं जानते जोखिम के बारे में।

यह भी ध्यान दें, क्योंकि टिप्पणीकार बताते हैं कि ऊपर सी के बारे में उपरोक्त वार्ता सी ++ नहीं है। मैं सी और सी ++ में अलग-अलग भाषाओं के रूप में बहुत दृढ़ता से विश्वास करता हूं।

आगे जोड़ने के लिए, आपका कोड अनिवार्य रूप से प्रकार की जानकारी दोहराता है (int) जो त्रुटियों का कारण बन सकता है। रिटर्न वैल्यू को स्टोर करने के लिए पॉइंटर का उपयोग करने के लिए बेहतर है, दोनों को एक साथ "लॉक" करने के लिए:

int *sieve = malloc(length * sizeof *sieve);

यह भी चलता है length बढ़ती दृश्यता के लिए सामने के लिए, और अनावश्यक कोष्ठक के साथ छोड़ देता है sizeof; वे केवल जरूरत है जब तर्क एक प्रकार का नाम है। बहुत से लोग इस बारे में नहीं जानते (या अनदेखा करते हैं), जो उनके कोड को अधिक वर्बोज़ बनाता है। याद है: sizeof एक समारोह नहीं है! :)


चलते समय length आगे की तरफ़ हो सकता है कुछ दुर्लभ मामलों में दृश्यता में वृद्धि, किसी को यह भी ध्यान देना चाहिए कि सामान्य मामले में, अभिव्यक्ति को लिखना बेहतर होना चाहिए:

int *sieve = malloc(sizeof *sieve * length);

रखने के बाद से sizeof सबसे पहले, इस मामले में, सुनिश्चित करता है कि गुणा कम से कम किया जाता है size_t गणित।

की तुलना करें: malloc(sizeof *sieve * length * width) बनाम malloc(length * width * sizeof *sieve) दूसरा बह सकता है length * width कब width तथा length छोटे प्रकार के हैं size_t


1917
2018-03-03 10:17



@unwind नहीं, सख्त सी कोड में भी, मैं पोर्टेबिलिटी के लिए कलाकार का उपयोग करता हूं। पोर्टेबिलिटी का मेरा मतलब सी मानक के पुराने संस्करणों के लिए पोर्टेबल है जहां शून्य * को बढ़ावा नहीं दिया जाता है। मैं के एंड आर की "द सी प्रोग्रामिंग लैंग्वेज" से उद्धरण देता हूं: "सी में, यह घोषणा करना उचित तरीका है कि मॉलोक शून्य के लिए एक सूचक लौटाता है, फिर पॉइंटर को वांछित प्रकार में एक कलाकार के साथ स्पष्ट रूप से मजबूर करता है।" इस तरह की आवश्यकता को लागू करने का कारण यह है कि आप हमेशा एक संकलक का चयन नहीं करते हैं जिसका आप उपयोग कर सकते हैं। - chacham15
@ chacham15 जबकि सी के पहले संस्करण थे भाषा जहां कलाकार आवश्यक था (के एंड आर सी में कोई नहीं था void* टाइप करें!), वे संस्करण कभी नहीं थे मानक। सी 8 9 (पहला मानकीकृत संस्करण) आवश्यक है malloc वापसी void* और वह void* निहित रूप से परिवर्तनीय हो। - jamesdlin
@ सौमेन यह शायद बहुत अस्पष्ट है; बिना वापसी प्रकार शामिल किए int माना जाएगा, जो छोटे से हो सकता है void *, इसलिए असाइनमेंट एक चेतावनी उत्पन्न कर सकता है, जिसे कास्ट द्वारा दबाया जाएगा। देख यह प्रश्न उदाहरण के लिए। - unwind
@unwind अधिकांश कंपाइलर्स आपको एक स्पष्ट रूप से परिभाषित फ़ंक्शन के बारे में चेतावनी देंगे ... (इसलिए मुझे कास्ट का खतरा दिखाई नहीं देता है) - DarthRubik
@ N.m। ठीक। मुझे लगता है कि यह मानना ​​बुरा है कि यहां पढ़ने वाले किसी भी व्यक्ति को एक विशेष संकलक है। इसके अलावा, सी 11 के बाद से संपूर्ण "निहित कार्य" अवधारणा खत्म हो गई है, मुझे यह नहीं पता था। फिर भी, मुझे एक व्यर्थ कलाकार डालने में बिंदु नहीं दिख रहा है। क्या आप भी करते हैं int x = (int) 12; बस चीजों को स्पष्ट करने के लिए? - unwind


सी में, आपको वापसी मूल्य डालने की आवश्यकता नहीं है malloc। शून्य के लिए सूचक द्वारा लौटाया गया malloc स्वचालित रूप से सही प्रकार में परिवर्तित हो जाता है। हालांकि, अगर आप अपने कोड को सी ++ कंपाइलर के साथ संकलित करना चाहते हैं, तो एक कलाकार की आवश्यकता होती है। समुदाय के बीच एक पसंदीदा विकल्प निम्नलिखित का उपयोग करना है:

int *sieve = malloc(sizeof *sieve * length);

जो अतिरिक्त रूप से अभिव्यक्ति के दाईं ओर बदलने के बारे में चिंता करने से आपको मुक्त करता है यदि कभी भी आप प्रकार बदलते हैं sieve

जानवर खराब हैं, क्योंकि लोगों ने बताया है। विशेष रूप से सूचक संकेत करता है।


327
2018-03-03 10:17



@MAKZ मैं उस पर बहस करता हूं malloc(length * sizeof *sieve) यह दिखता है sizeof एक चर है - तो मुझे लगता है malloc(length * sizeof(*sieve)) अधिक पठनीय है। - Michael Anderson
तथा malloc(length * (sizeof *sieve)) अभी भी और अधिक पठनीय। IMHO। - Toby Speight
@ माइकल एंडरसन () एक तरफ इशारा करते हुए, ध्यान दें कि आपकी सुझाई गई शैली ने आदेश को बदल दिया है।, जब तत्व गणना की गणना की जाती है तो विचार करें length*width, रखते हुए sizeof सबसे पहले इस मामले में बीमा कम से कम गुणा किया जाता है size_t गणित। तुलना malloc(sizeof( *ptr) * length * width) बनाम malloc(length * width * sizeof (*ptr)) - दूसरा अतिप्रवाह हो सकता है length*width कब width,length छोटे प्रकार हैं कि size_t। - chux
@chux यह स्पष्ट नहीं है, लेकिन उत्तर संपादित किया गया है ताकि मेरी टिप्पणी कम प्रासंगिक हो - मूल सुझाव था malloc(sizeof *sieve * length) - Michael Anderson
सी सी ++ नहीं है। यह दिखाते हुए कि वे आखिरकार भ्रम और उदासी का कारण बनेंगे। यदि आप सी ++ का उपयोग कर रहे हैं, तो सी-स्टाइल कास्ट भी खराब है (जब तक कि आप एक बहुत पुराने सी ++ कंपाइलर का उपयोग नहीं कर रहे हों)। तथा static_cast>()(या reinterpret_cast<>() ) सी की किसी भी बोली के साथ संगत नहीं है - David C.


आप कर कास्ट, क्योंकि:

  • यह आपका कोड बनाता है अधिक पोर्टेबल सी और सी ++ के बीच, और एसओ अनुभव के रूप में, बहुत से प्रोग्रामर दावा करते हैं कि वे सी में लिख रहे हैं जब वे वास्तव में सी ++ (या सी प्लस स्थानीय कंपाइलर एक्सटेंशन) में लिख रहे हैं।
  • ऐसा करने में विफल एक त्रुटि छुपा सकते हैं: लिखने के लिए भ्रमित करने के सभी SO उदाहरणों को नोट करें type * बनाम type **
  • यह विचार कि यह आपको ध्यान देने से रोकता है, आप विफल रहे #include एक उपयुक्त हेडर फ़ाइल याद आती है पेड़ के लिए जंगल। यह कहने जैसा ही है "इस तथ्य के बारे में चिंता न करें कि आप प्रोटोटाइप को न देखने के बारे में शिकायत करने के लिए संकलक से पूछने में असफल रहे - कि यादृच्छिक stdlib.h याद रखने के लिए असली महत्वपूर्ण बात है!"
  • यह एक बल देता है अतिरिक्त संज्ञानात्मक क्रॉस-चेक। यह उस चर के आकार के गणित के बगल में वांछित प्रकार (कथित) वांछित प्रकार रखता है। मुझे यकीन है कि आप एक एसओ अध्ययन कर सकते हैं जो दिखाता है malloc() एक कलाकार होने पर बग बहुत तेजी से पकड़े जाते हैं। दावे के साथ, एनोटेशन जो इरादे प्रकट करते हैं, बग कम करते हैं।
  • मशीन को जांचने के तरीके में खुद को दोहराएं अक्सर एक होता है महान विचार। वास्तव में, यह एक दावा है, और कास्ट का यह उपयोग एक दावा है। कोडिंग सही होने के लिए हमारे पास अभी भी सबसे सामान्य तकनीक है, क्योंकि ट्यूरिंग इतने सालों पहले इस विचार के साथ आया था।

292
2018-02-14 16:15



@ulidtko यदि आपको पता नहीं था, तो कोड लिखना संभव है जो सी और सी ++ दोनों के रूप में संकलित करता है। असल में अधिकांश हेडर फाइलें इस तरह हैं, और उनमें अक्सर कोड (मैक्रोज़ और इनलाइन फ़ंक्शन) होते हैं। एक होने .c/.cpp संकलित करने के लिए फ़ाइल दोनों अक्सर उपयोगी नहीं है, लेकिन एक मामला सी ++ जोड़ रहा है throw सी ++ कंपाइलर के साथ संकलित जब समर्थन (लेकिन return -1; जब सी संकलक, या जो कुछ भी संकलित)। - hyde
अगर किसी के पास हेडर में मॉलोक कॉल इनलाइन है तो मैं प्रभावित नहीं होगा, #ifdef __cplusplus और बाहरी "सी" {} इस नौकरी के लिए हैं, अतिरिक्त कास्ट में नहीं जोड़ रहे हैं। - paulm
खैर, बिंदु 1 अप्रासंगिक है, क्योंकि सी! = सी ++, यदि आप उपयोग करते हैं तो अन्य बिंदु भी तुच्छ हैं परिवर्तनीय आपके में malloc फोन: char **foo = malloc(3*sizeof(*foo)); अगर काफी पूर्ण प्रमाण: चार पॉइंटर्स के लिए 3 पॉइंटर्स। फिर लूप, और करो foo[i] = calloc(101, sizeof(*(foo[i])));। 101 वर्णों की सरणी आवंटित करें, जो शून्य से प्रारंभिक रूप से प्रारंभ की गई हैं। कोई कलाकार की जरूरत नहीं है। घोषणा को बदलें unsigned char या किसी अन्य प्रकार, उस मामले के लिए, और आप अभी भी अच्छे हैं - Elias Van Ootegem
जब मैंने सोचा कि मुझे मिल गया, तो यह आता है! शानदार जवाब। StackOverflow में यह पहली बार है कि मैं दो विपरीत उत्तरों को +1 करता हूं! +1 नहीं, आप कास्ट नहीं करते हैं, और +1 हां, आप कास्ट करते हैं! जबरदस्त हंसी। तुम लोग भयानक हो और मेरे और मेरे छात्रों के लिए, मैंने अपना मन बना दिया: मैं कास्ट करता हूं। कास्टिंग करते समय छात्रों की तरह की त्रुटियों को आसानी से देखा जाता है। - Dr Beco
@Leushenko: अपने आप को इस तरह से दोहराएं कि मशीन द्वारा मान्य नहीं किया जा सकता है और न ही स्थानीय निरीक्षण से बुरा है। ऐसे तरीकों से खुद को दोहराएं जिन्हें इस तरह से मान्य किया जा सकता है कम बुरा है। दिया हुआ struct Zebra *p; ... p=malloc(sizeof struct Zebra);, मॉलोक पी के प्रकार के बारे में डुप्लिकेटिंग जानकारी से बच नहीं सकता है, लेकिन न तो संकलक और न ही स्थानीय कोड निरीक्षण किसी भी प्रकार का पता लगाएगा यदि एक प्रकार बदल गया लेकिन दूसरा नहीं। कोड को बदलें p=(struct Zebra*)malloc(sizeof struct Zebra); और अगर कास्ट प्रकार मेल नहीं खाता है तो संकलक squawk होगा p, तथा स्थानीय निरीक्षण प्रकट होगा ... - supercat


जैसा कि अन्य ने कहा है, सी के लिए इसकी आवश्यकता नहीं है, लेकिन सी ++ के लिए। यदि आपको लगता है कि आप अपने सी कोड को सी ++ कंपाइलर के साथ संकलित करने जा रहे हैं, जिसके कारण कभी भी आप मैक्रो का उपयोग कर सकते हैं, जैसे:

#ifdef __cplusplus
# define NEW(type, count) ((type *)calloc(count, sizeof(type)))
#else
# define NEW(type, count) (calloc(count, sizeof(type)))
#endif

इस तरह आप इसे अभी भी एक बहुत ही कॉम्पैक्ट तरीके से लिख सकते हैं:

int *sieve = NEW(int, 1);

और यह सी और सी ++ के लिए संकलित होगा।


148
2018-03-03 11:17



चूंकि आप किसी मैक्रो का उपयोग कर रहे हैं, आप इसका उपयोग क्यों नहीं करते हैं new सी ++ की परिभाषा में? - Hosam Aly
क्योंकि ऐसा करने का कोई कारण नहीं है। यह मुख्य रूप से सी प्रोग्राम के लिए है जो एक सी ++ कंपाइलर के साथ संकलित हैं। यदि आप 'नया' उपयोग करने जा रहे हैं, तो आपको केवल एक चीज समस्या है। इसके बाद आपको एक मैक्रो भी मुफ्त में चाहिए। और आपको एक सरणी मुक्त करने के लिए एक मैक्रो की आवश्यकता है, एक भिन्नता जो सी में मौजूद नहीं है। - quinmars
उल्लेख नहीं है कि यह नहीं है कि आप स्मृति को मुक्त करते हैं, लेकिन शायद आप जिस सी लाइब्रेरी का उपयोग कर रहे हैं, आदि। किसी भी लाभ के बिना कई संभावित समस्याएं। - quinmars
@ होसम: हाँ, यह निश्चित रूप से है। यदि तुम प्रयोग करते हो new तुम्हें अवश्य उपयोग करना चाहिए delete और यदि आप उपयोग करते हैं malloc() आपको चाहिए free()। उन्हें कभी मिलाएं। - Graeme Perrow
यदि कोई इस दृष्टिकोण को लेने जा रहा है, तो मैक्रो को बुलाओ NEW शायद एक बुरा विचार है क्योंकि संसाधन का उपयोग कभी वापस नहीं किया जाता है delete(या DELETE) तो आप अपनी शब्दावली मिश्रण कर रहे हैं। इसके बजाय, इसका नामकरण MALLOC, या यों कहें CALLOC इस मामले में, अधिक समझ में आता है। - mah


वहाँ से विकिपीडिया

कास्टिंग के लिए लाभ

  • कलाकारों को शामिल करने से सी प्रोग्राम या फ़ंक्शन को C ++ के रूप में संकलित करने की अनुमति मिल सकती है।

  • कास्ट मॉलोक के पूर्व -198 संस्करणों के लिए अनुमति देता है जो मूल रूप से एक char * लौटाता है।

  • कास्टिंग डेवलपर को टाइप आकार में असंगतता की पहचान करने में मदद कर सकता है, गंतव्य सूचक प्रकार बदलना चाहिए, विशेष रूप से यदि सूचक को मॉलोक () कॉल से दूर घोषित किया जाता है (हालांकि आधुनिक कंपाइलर्स और स्थिर विश्लेषक कलाकारों के बिना इस तरह के व्यवहार पर चेतावनी दे सकते हैं)।

कास्टिंग करने के नुकसान

  • एएनएसआई सी मानक के तहत, कास्ट अनावश्यक है।

  • कास्ट जोड़ना हेडर को शामिल करने में मास्क विफलता हो सकता है stdlib.hमें   जो मॉलोक के लिए प्रोटोटाइप पाया जाता है। ए की अनुपस्थिति में   मॉलोक के लिए प्रोटोटाइप, मानक के लिए सी संकलक की आवश्यकता है   मान लें कि मॉलोक एक int देता है। यदि कोई कलाकार नहीं है, तो चेतावनी है   जारी किया गया जब यह पूर्णांक सूचक को सौंपा गया है; हालांकि, के साथ   कास्ट, यह चेतावनी नहीं बनाई गई है, एक बग छुपा रहा है। निश्चित पर   आर्किटेक्चर और डेटा मॉडल (जैसे 64-बिट सिस्टम पर एलपी 64, जहां   लंबे और पॉइंटर्स 64-बिट हैं और int 32-बिट है), यह त्रुटि कर सकती है   असल में घोषित व्यवहार के रूप में, अनिश्चित व्यवहार में परिणाम   मॉलोक 32-बिट मान देता है जबकि वास्तव में परिभाषित फ़ंक्शन   एक 64-बिट मान देता है। कॉलिंग सम्मेलनों और स्मृति के आधार पर   लेआउट, इसका परिणाम स्टैक स्मैशिंग हो सकता है। यह मुद्दा कम संभावना है   आधुनिक कंपाइलरों में अनजान जाने के लिए, जैसा कि वे समान रूप से उत्पादन करते हैं   चेतावनियां कि एक अविकसित कार्य का उपयोग किया गया है, इसलिए एक चेतावनी होगी   अभी भी दिखाई देते हैं। उदाहरण के लिए, जीसीसी का डिफ़ॉल्ट व्यवहार एक दिखाना है   चेतावनी जो "अंतर्निहित अंतर्निहित निहित घोषणा" पढ़ती है   समारोह "चाहे कलाकार मौजूद है या नहीं।

  • यदि इसकी घोषणा में पॉइंटर का प्रकार बदला जाता है, तो कोई भी हो सकता है   भी, उन सभी लाइनों को बदलने की जरूरत है जहां मॉलोक कहा जाता है और कास्ट किया जाता है।

हालांकि कास्टिंग के बिना malloc पसंदीदा तरीका है और सबसे अनुभवी प्रोग्रामर इसे चुनते हैं, आपको जो भी मुद्दों के बारे में पता होना चाहिए, उसका उपयोग करना चाहिए।

यानी: यदि आपको सी प्रोग्राम को सी ++ के रूप में संकलित करने की आवश्यकता है (हालांकि वे अलग भाषा हैं) तो आपको इसका उपयोग करना चाहिए malloc कास्टिंग के साथ।


96
2017-10-09 21:23



क्या करता है "कास्टिंग डेवलपर को प्रकार के आकार में असंगतता की पहचान करने में मदद कर सकता है गंतव्य सूचक प्रकार बदलना चाहिए, खासकर यदि सूचक को दूर से घोषित किया गया हो malloc()कॉल"मतलब? क्या आप एक उदाहरण दे सकते हैं? - Cool Guy
@शांत लड़का: किसी अन्य उत्तर पर पहले की टिप्पणी देखें। लेकिन ध्यान दें कि p = malloc(sizeof(*p) * count) idiom स्वचालित रूप से प्रकार में परिवर्तन उठाता है, इसलिए आपको चेतावनियां प्राप्त करने और कुछ भी बदलने की आवश्यकता नहीं है। इसलिए यह वास्तविक लाभ नहीं बनाम बनाम कास्टिंग के लिए सबसे अच्छा विकल्प नहीं है। - Peter Cordes
यह उचित उत्तर है: पेशेवर और विपक्ष हैं, और यह स्वाद के मामले में उबाल जाता है (जब तक कोड को C ++ के रूप में संकलित नहीं किया जाता है - तब कास्ट अनिवार्य है)। - Peter A. Schneider
प्वाइंट 3 म्यूट है, क्योंकि अगर इसकी घोषणा में पॉइंटर का प्रकार बदला जाता है, तो किसी को उस प्रकार के मॉलोक, रीयलोक और मुफ्त में प्रत्येक इंस्टेंस की जांच करनी चाहिए। कास्टिंग आपको बस ऐसा करने के लिए मजबूर करेगा। - Michaël Roy


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


94
2018-03-03 10:18





आप मॉलोक का नतीजा नहीं डालते हैं, क्योंकि ऐसा करने से आपके कोड में व्यर्थ अव्यवस्था बढ़ जाती है।

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

कुछ टिप्पणियां:

  • एक शून्य सूचक को किसी भी अन्य सूचक प्रकार से स्पष्ट रूप से बिना किसी कास्ट (सी 11 6.3.2.3 और 6.5.16.1) में परिवर्तित किया जा सकता है।

  • सी ++ हालांकि एक अंतर्निहित कास्ट के बीच अनुमति नहीं देगा void* और एक और सूचक प्रकार। तो सी ++ में, कास्ट सही होता। लेकिन यदि आप सी ++ में प्रोग्राम करते हैं, तो आपको इसका उपयोग करना चाहिए new और malloc () नहीं। और आपको कभी भी C ++ कंपाइलर का उपयोग करके सी कोड संकलित नहीं करना चाहिए।

    यदि आपको एक ही स्रोत कोड के साथ सी और सी ++ दोनों का समर्थन करने की आवश्यकता है, तो मतभेदों को चिह्नित करने के लिए कंपाइलर स्विच का उपयोग करें। एक ही कोड के साथ दोनों भाषा मानकों को पूरा करने का प्रयास न करें, क्योंकि वे संगत नहीं हैं।

  • यदि कोई सी कंपाइलर फ़ंक्शन नहीं ढूंढ पा रहा है क्योंकि आप हेडर को शामिल करना भूल गए हैं, तो आपको इसके बारे में एक कंपाइलर / लिंकर त्रुटि मिलेगी। तो अगर आप शामिल करना भूल गए हैं <stdlib.h> यह कोई बड़ी बात नहीं है, आप अपना प्रोग्राम बनाने में सक्षम नहीं होंगे।

  • प्राचीन कंपाइलर्स पर जो मानक के एक संस्करण का पालन करते हैं जो 25 वर्ष से अधिक पुराना है, शामिल करना भूल जाता है <stdlib.h> खतरनाक व्यवहार का परिणाम होगा। क्योंकि उस प्राचीन मानक में, एक दृश्य प्रोटोटाइप के बिना कार्यों ने पूरी तरह से वापसी प्रकार को रूपांतरित कर दिया int। मॉलोक से परिणाम कास्टिंग स्पष्ट रूप से इस बग को छिपाएगा।

    लेकिन यह वास्तव में एक गैर मुद्दा है। आप 25 साल के कंप्यूटर का उपयोग नहीं कर रहे हैं, तो आप 25 साल के कंपाइलर का उपयोग क्यों करेंगे?


83
2018-03-20 15:53



"व्यर्थ अव्यवस्था" बर्खास्तगी हाइपरबोले है जो किसी भी व्यक्ति को विश्वास दिलाने की किसी भी संभावना को दूर करने का प्रयास करता है जो पहले से ही आपसे सहमत नहीं है। एक कलाकार निश्चित रूप से व्यर्थ नहीं है; रॉन बर्क और काज़ के जवाब कास्टिंग के पक्ष में तर्क देते हैं कि मैं बहुत सहमत हूं। चाहे वे आपकी चिंताओं से अधिक वजन रखते हैं, पूछने के लिए एक उचित सवाल है। मेरे लिए, आपकी चिंताओं की तुलना में अपेक्षाकृत मामूली दिखती है। - Don Hatch
"एक शून्य सूचक को किसी भी अन्य सूचक प्रकार से किसी स्पष्ट कलाकार के बिना / में परिवर्तित किया जा सकता है" 6.3.2.3 द्वारा समर्थित नहीं है। शायद आप "किसी ऑब्जेक्ट प्रकार के सूचक" के बारे में सोच रहे हैं? "शून्य पॉइंटर" और "फ़ंक्शन टू पॉइंटर" इतनी आसानी से परिवर्तनीय नहीं हैं। - chux
दरअसल संदर्भ अपूर्ण था। "Implicitness" के लिए प्रासंगिक भाग सरल असाइनमेंट 6.5.16.1 का नियम है। "एक ऑपरेंड ऑब्जेक्ट प्रकार के लिए एक सूचक है, और दूसरा शून्य के योग्य या अयोग्य संस्करण के लिए एक सूचक है"। मैंने पूर्णता के उत्तर में यह संदर्भ जोड़ा है। - Lundin


सी में आप से एक निहित रूपांतरण मिलता है void* किसी अन्य (डेटा) सूचक के लिए।


82
2018-03-03 10:16



@ जेन्स: ठीक है, शायद अधिक उचित शब्द "अंतर्निहित रूपांतरण" है। फ्लोटिंग पॉइंट एक्सप्रेशन में अभिन्न चर के उपयोग की तरह। - EFraim
@EFraim वास्तव में एक कास्ट, और उस पर एक निहित एक परिणाम होगा। - Mad Physicist


द्वारा लौटा मूल्य कास्टिंग malloc() अब जरूरी नहीं है, लेकिन मैं एक बिंदु जोड़ना चाहता हूं जो ऐसा लगता है कि किसी ने भी ध्यान नहीं दिया है:

प्राचीन दिनों में, वह पहले है एएनएसआई सी प्रदान करता है void * सामान्य प्रकार के पॉइंटर्स के रूप में, char * इस तरह के उपयोग के लिए प्रकार है। उस स्थिति में, कलाकार संकलक चेतावनियां बंद कर सकता है।

संदर्भ: सी अकसर किये गए सवाल


62
2018-06-09 17:31



कंपाइलर चेतावनियों को बंद करना एक बुरा विचार है। - Albert van der Horst
@AlbertvanderHorst यदि आप सही समस्या को हल करके ऐसा कर रहे हैं तो चेतावनी आपको चेतावनी देने के लिए है। - Dan Bechard
@ डैन यदि सटीक समस्या को हल करने का मतलब है char * के बजाय आधुनिक एएनएसआई सी प्रकारों को वापस करने के लिए एक सबराउटिन का पुनर्लेखन, मैं सहमत हूं। मैं संकलक को बंद करने के लिए फोन नहीं करता। उन प्रबंधकों को न दें जो जोर देते हैं कि संभावित समस्याओं को खोजने के लिए प्रत्येक पुनर्मूल्यांकन द्वारा उन्हें उपयोग करने के बजाय कोई संकलक चेतावनी नहीं है। ग्रेटजेस अल्बर्ट - Albert van der Horst