2013-06-01 6 views
7

मेरे पास एक सवाल था।सी ++ नया * चार खाली नहीं है

मैं ASIO में सर्वर के विकास और पैकेट उठाई चार में हैं।

जब मैं नया चार (उदा। char * buffer = new char[128];) मैं इसे nulls करने के लिए मैन्युअल रूप से साफ करना चाहिए पैदा करते हैं।

द्वारा:

for(int i =0;i<128;i++) 
{ 
buffer[i] = 0x00; 
} 

मैं कुछ गलत कर, कि चार स्पष्ट नहीं है?

+0

आपका प्रश्न पहले से ही द्वारा उत्तर दिया जाता है [प्रकार नाम के बाद कोष्ठक नए के साथ एक फर्क है?] (Http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name बनाओ एक अंतर-साथ नए)। – Troubadour

उत्तर

19

शायद आपने प्रारंभ मूल्यों की एक सरणी से अधिक पाश की जरूरत नहीं है। आप गतिशील रूप से इस तरह शून्य की सरणी का दृष्टांत कर सकते हैं:

char * buffer = new char[128](); // all elements set to 0 
          ^^ 
3

आवंटित स्मृति स्पष्ट नहीं हो जाएगा, यह बजाय यादृच्छिक सामान शामिल होंगे। इस तरह मेमोरी आवंटन काम करता है। आपको मैन्युअल रूप से इसे साफ़ करने के लिए for -loop या memset का उपयोग करना होगा।

-5

चूंकि यह एक सूचक है, तो आप इसे इस तरह करना चाहिए:

for(int i = 0; i < 128; i++) 
{ 
(buffer + i) = 0x00; 
} 
+1

-1: कोड गलत है (0x00 को रावल्यू को असाइन करना) और सलाह गलत है (ओपी का कोड संकलित करता है, आपका नहीं है)। – milleniumbug

+0

1. आप एलएचएस को अपमानित करना भूल गए हैं ताकि आप आर-वैल्यू को असाइन करने का प्रयास कर रहे हैं (आपका कोड संकलित नहीं होगा)। 2 'बफर [i]' भाषा मानक द्वारा '* (बफर + i)' जैसा ही है। जबकि सरणी और पॉइंटर्स * इस संदर्भ में अलग-अलग भाषा मानक हैं, वे कुछ डिग्री के लिए अंतर-परिवर्तनीय हैं। –

11

C++ नए ऑपरेटर को फोन के तरीकों में से दो प्रकार के होते हैं - डिफ़ॉल्ट initialised और शून्य initialised।

आरंभ डिफ़ॉल्ट करने के लिए कॉल (जो मूल्य अपरिभाषित छोड़ देंगे):

int * i = new int; 

यह तो पढ़ने के लिए या जब तक इसकी स्थापना की गई इस मान का उपयोग करने के लिए अपरिभाषित behavoir है।

zeroinitialise करने के लिए (जो 0 पर सेट हो जाएगा) का उपयोग करें:

int * i = new int(); 

यह भी सरणियों के साथ काम करता है:

int * i = new int[4]; // ints are not initialised, you must write to them before reading them 
int * i = new int[4](); // ints all zero initialised 

वहाँ कुछ और अधिक जानकारी here

2

तुम भी calloc का उपयोग कर सकते है। यह प्रत्येक elem से 0 automaticaly शुरू होता है। उदाहरण के लिए:

char* buffer = (char *) calloc (128, sizeof (char)) 

प्रथम परम ब्लॉक की संख्या आवंटित किया जाना है। दूसरा ब्लॉक का आकार है। इस समारोह शून्य रिटर्न * ताकि आप करने के लिए (चार *) अपने मूल्य कन्वर्ट करना होगा आप calloc (या malloc या किसी "शुद्ध ग" आवंटन कार्यों) का उपयोग करते हैं तो आप बेहतर हटाने की बजाय स्मृति पुनःआवंटन को free समारोह का उपयोग करेंगे।

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