सी में आप malloc
द्वारा लौटाए गए शून्य सूचक को कास्ट कर सकते हैं। सी यह आपके लिए करता है लेकिन आप भी स्पष्ट हो सकते हैं।
malloc
void *
या शून्य पॉइंटर लौटाता है, तो यह लौटाया गया मूल्य प्रोग्रामर द्वारा अन्य पॉइंटर प्रकारों में डाला जा सकता है। या प्रोग्रामर टाइप रूपांतरण करने के लिए सी पर निर्भर हो सकता है। कास्ट का उपयोग कर सी का प्रकार रूपांतरण बदलने की उम्मीद नहीं है।
हालांकि, सी-कंपाइलर पर निर्भर सी कोड बाधा और पढ़ने में मुश्किल हो सकता है। एक डेवलपर प्रोग्रामर रखरखाव प्रोग्रामर की मदद कर सकता है जो अंततः कोड को पढ़ना होगा।
malloc
के लौटे हुए मूल्य पर एक स्पष्ट कलाकार जोड़ना उन लोगों की सहायता करता है जिनके पास कोड पढ़ने और लेखक के इरादे को निर्धारित करने के लिए होगा। malloc
द्वारा लौटाए गए शून्य सूचक को स्पष्ट रूप से कास्टिंग करने का यह वास्तविक लाभ है। यह प्रोग्रामिंग अभ्यास संकलक को गलत तरीके से निर्देशित नहीं करता है या कुछ आर्केन कंपाइलर सुविधा का उपयोग नहीं करता है जो बदल सकता है।
निम्नलिखित तीन उदाहरण इस प्रोग्रामिंग अभ्यास को हाइलाइट करते हैं। पहले उदाहरण में, malloc
(जिसे <stdlib.h>
में परिभाषित किया गया है) स्पष्ट रूप से कास्ट किया गया है और कुछ मामूली काम किया गया है।
#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = (char *) malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// prints abc at the console
}
इस दूसरे उदाहरण में, फर्क सिर्फ इतना है कि <stdlib.h>
बाहर टिप्पणी की है। कोड अभी भी चलाता है और एक ही परिणाम उत्पन्न करता है। अब, यह क्यों काम करता है "क्यों" काफी प्रत्यक्ष है। जब सी को किसी फ़ंक्शन के प्रोटोटाइप नहीं मिलते हैं तो यह मानता है कि फ़ंक्शन int
देता है, लेकिन malloc
एक शून्य पॉइंटर देता है।इस मामले में स्पष्ट कलाकार ने सी कंपाइलर के साथ-साथ स्रोत की कार्बन इकाई को बताया है कि malloc
द्वारा लौटाए गए मान को एक वर्ण सूचक में परिवर्तित किया जाना चाहिए।
//#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = (char *) malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// prints abc at the console
}
अंतिम (हाँ) उदाहरण डाली जारी नहीं करता है और <stdlib.h>
शामिल नहीं है। ग्रहण संपादक और संकलक दोनों इस कोड के बारे में शिकायत करते हैं (जैसा कि उन्हें करना चाहिए)। संकलक संदेश
..\main.c(18) : warning C4047: '=' : 'char *' differs in levels of indirection from 'int'
है और स्रोत कोड है:
//#include <stdlib.h>
#define nr_chars 4
main()
{
char *data;
data = malloc(nr_chars*sizeof(char));
*data++ = 'a';
*data++ = 'b';
*data++ = 'c';
*data++ = '\0'; // it is allowed to go one past an array
data -= nr_chars; // back to the front of data
printf("%s\n", data);
// compiler displays a "warning" and prints abc at the console
}
बदलने उदाहरण 3 कोई चेतावनी में परिणाम शामिल करने के लिए और के रूप में इरादा कार्यक्रम चलाता है। हालांकि, दोनों उदाहरण 2 और 3 में स्पष्ट कलाकारों की कमी है और इस शैली में लिखे गए कोड के जीवनकाल में इस तरह का कोड अधिक महंगा होगा और मनुष्यों द्वारा गलत तरीके से बदला जा सकता है (इस प्रकार अतिरिक्त व्यय) जो कि समर्थित हैं सी compilers।
[शून्य \ * 'से' नोड \ * '\ [-fpermissive \]] से अवैध रूपांतरण [http://stackoverflow.com/questions/16793587/invalid-conversion-from-void-to -node-fpermissive) –
मुझे नहीं लगता कि त्रुटि संदेश 'void का उपयोग kiss_fft_ctx' को प्रारंभ करने के लिए नहीं किया जा सकता है। मुझे लगता है कि यह 'शून्य *' और 'kss_fft_ctx *' था। उन तारों का अर्थ ** बीआईजी ** अर्थ और भाषा की आपकी समझ में अंतर बनाता है। सी ++ के बारे में नोट के लिए – abelenky