2009-10-27 17 views
6
int length = strlen(src); 
    char *structSpace = malloc(sizeof(String) + length + 1); 
    String *string = (String*) structSpace;  
    int *string = (int*) structSpace; 

* मैं क्योंकि malloc शून्य करने के लिए एक सूचक देता है, जैसे कि, यह केवल डेटा है कि वहाँ संग्रहीत किया जाएगा करने के लिए के रूप में कोई संबंध स्मृति का हिस्सा आवंटित किया गया है एक struct स्ट्रिंगहमें मॉलोक रिटर्न डालने की आवश्यकता क्यों है?

+1

सी और सी ++ दो अलग-अलग भाषाएं हैं, यह सी की तरह दिखता है, प्रश्न से सी ++ टैग को हटाने से संभावित उत्तरदाताओं के लिए इसे स्पष्ट किया जाएगा। – joshperry

+0

तब "स्ट्रिंग" वास्तव में क्या है? –

+0

'स्ट्रिंग *' मुझे सी की तरह नहीं दिखता है, लेकिन यह स्पष्ट रूप से उस तरीके से अधिक तरीकों से भ्रमित है। –

उत्तर

15

आप नहीं करते हैं। void* आपको सी में जो कुछ भी चाहिए, उसे पूरी तरह से डाला जाएगा। C FAQ पर भी देखें कि आप स्पष्ट रूप से सी। सीनान के जवाब में मॉलोक की वापसी कास्टिंग क्यों नहीं करना चाहते हैं और आगे बताते हैं कि यह असंगत रूप से क्यों चल रहा है।

+2

+1। हालांकि, सी ++ एक अलग कहानी है। –

+1

सही, आपको सी ++ में मॉलोक का उपयोग नहीं करना चाहिए। –

+1

यह सामान्य प्रतिक्रिया है, लेकिन मैं पूरी तरह से सहमत नहीं हूं। निश्चित रूप से, यदि आपके पास ब्राइंडेड कंपाइलर है तो यह आपको 'stdlib.h' सहित बिना दूर जाने दे सकता है, लेकिन कुछ ऐसे मामले हैं जहां आप कंपाइलर को अपना काम जांचने दे सकते हैं। Http://stackoverflow.com/questions/1322884/does-going-out-of-scope-like-this-free-the-associated-memory/1322898#1322898 –

6

बुलाया बनाया। सी ++ में आपका लौटा शून्य * आपके प्रकार के सूचक को निहित रूप से नहीं डाला जाएगा। आपके उदाहरण में, आपने मॉलोक को वापस नहीं डाला है। मॉलोक ने एक शून्य * वापस कर दिया जिसे पूर्ण रूप से चार * पर डाला गया था, लेकिन अगली पंक्ति पर ... ठीक है, अब यह और अधिक समझ में नहीं आता है।

+0

ओह! अब के बारे में क्या? – user133466

+0

अब आपका कोड समझ में नहीं आता है। 'स्ट्रिंग' नामक दो चर? आप वास्तव में क्या पूछने की कोशिश कर रहे हैं? –

+0

स्पष्ट होने के लिए, आपको सी प्रोग्रामिंग भाषा में 'malloc() 'के वापसी मूल्य को वास्तव में नहीं डालना चाहिए और नहीं करना चाहिए। यह एक पुरानी समस्या से संबंधित है जो सी 0 9 से पहले एक मुद्दा था। मुझे लगता है कि मूल प्रश्न को सी ++ के रूप में टैग किया गया हो सकता है और सी नहीं, जिसके लिए उत्तरदाता ने कहा कि व्यवहार अलग है। – BobbyShaftoe

3

यह कुछ ऐसे मुद्दों में से एक है जो कथन "सी ++ सी का एक सुपरसेट है" पूरी तरह से सच नहीं है। सी में, void पॉइंटर को किसी अन्य प्रकार के पॉइंटर पर निहित रूप से डाला जा सकता है। हालांकि, सी ++ टाइप सुरक्षा के साथ थोड़ा अधिक सख्त है, इसलिए आपको उपयुक्त प्रकार पर malloc के वापसी मूल्य को स्पष्ट रूप से डालना होगा। आमतौर पर, यह कोई समस्या नहीं है, क्योंकि C++ कोड malloc के बजाय new का उपयोग करता है, जिसके लिए टाइपकास्टिंग की आवश्यकता नहीं होती है।

2

सी में, मॉलोक से परिणाम कास्टिंग अनावश्यक है और इसे नहीं किया जाना चाहिए। ऐसा करने के लिए, उदाहरण के लिए, #include <stdlib.h> में विफल होने की त्रुटि को कवर कर सकते हैं, इसलिए आपके पास स्कोप में मॉलोक के लिए प्रोटोटाइप नहीं है। यह बदले में, अन्य त्रुटियों और पोर्टेबिलिटी की कमी का कारण बन सकता है (हालांकि उस सम्मान में सबसे बुरे अपराधी अब अप्रचलित हैं)।

सी ++ में, आपको इसे मॉलोक के परिणाम को शून्य के अलावा किसी अन्य प्रकार के सूचक को असाइन करने के लिए डालना होगा। जब तक कि आप वास्तव में को कोड लिखने के लिए की आवश्यकता नहीं है जिसे सी या सी ++ के रूप में संकलित किया जा सकता है, हालांकि, आपको आम तौर पर malloc का उपयोग C++ में करना चाहिए और new का उपयोग करके स्मृति आवंटित करना चाहिए।

1

आप (:-) या सी ++ कोडर) novices से सी कोड के इस प्रकार देखते हैं:

int main() { 
    int len = 40; 
    char *my_string = (char *) malloc(sizeof(char)*len); 
    return 0; 
} 

यह अनावश्यक और बुराई है, तो आप stdlib.h

#include <stdlib.h> 
int main() { 
    int len = 40; 
    char *my_string = malloc(sizeof(char)*len); 
    return 0; 
} 
सहित के माध्यम से बेकार कलाकारों से बच सकते हैं
+2

पर मेरी टिप्पणी देखें यदि आप वास्तव में 'आकार' चाहते हैं 'char * my_string = malloc (sizeof (* my_string) * len) का उपयोग करें;' ताकि एलएचएस बदलने पर भी आरएचएस सही रहे। अन्यथा, ध्यान दें कि 'आकार (char) 'हमेशा' 1' है। –

+0

बीटीडब्ल्यू, यदि आप #शामिल नहीं करते हैं, तो कोड गलत है, क्योंकि प्रोटोटाइप के बिना malloc() int intpe देता है, और पॉइंटर मान एक int (अपरिभाषित व्यवहार ...) द्वारा प्रदर्शित नहीं हो सकते हैं – jpalecek

0

आपको मॉलोक कमांड का उपयोग करने के बाद दृढ़ता से विचार करना चाहिए क्योंकि यह आपके कार्यक्रम के अन्य हिस्सों के साथ अधिक पोर्टेबिलिटी और अधिक संगतता प्रदान करता है। यदि आप ऐसा नहीं करते हैं, तो आप असंगत डेटा प्रकारों का जोखिम चला सकते हैं जिसके परिणामस्वरूप त्रुटियां हो सकती हैं।

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