2011-02-02 10 views
12

आरंभ करने के लिए उचित तरीका unsigned char* आरंभ करने का सही तरीका क्या है? मैं वर्तमान में यह कर रहा हूं:बिना हस्ताक्षर किए गए चार *

unsigned char* tempBuffer; 
tempBuffer = ""; 

या मैं memset(tempBuffer, 0, sizeof(tempBuffer)); का उपयोग करना चाहिए?

+2

परिवर्तनीय नाम गलत है। यह एक बफर नहीं है, सिर्फ एक सूचक है। हस्ताक्षरित चार tempBuffer [666] के साथ एक बफर बनाएँ; –

उत्तर

8

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

+0

तो 'malloc (24);' (या कुछ संख्या) को आपकी राय में '' "' '' '' '' '' 'या' NULL' पर सेट करने पर प्राथमिकता दी जाएगी? – Brian

+0

@ ब्रायन: मुझे संदेह है कि कोई भी यह जानने के बिना जवाब दे सकता है कि आप क्या हासिल करना चाहते हैं। हालांकि, ऐसा लगता है कि आपको वास्तव में कुछ स्मृति आवंटित करने की आवश्यकता है। इस मामले में, जब आपको इसकी आवश्यकता नहीं होती है तो कभी भी 'मुक्त()' को न भूलें। – ereOn

+0

@ ब्रायन: आम तौर पर जब आप अधिकतम आकार की आवश्यकता होगी तो संकलन समय पर अज्ञात होने पर आम तौर पर 'malloc' का उपयोग किया जाता है, इसलिए आप इसे पहले 'NULL' पर सेट करेंगे, फिर' malloc' जितना आपको आकार के बारे में पता होना चाहिए। एक सरणी आवंटित करना बेहतर होता है जब आकार अपेक्षाकृत छोटा और निश्चित होता है, क्योंकि आपको स्मृति को मुक्त करने की चिंता करने की आवश्यकता नहीं होती है, लेकिन यदि आप इसे अपने फ़ंक्शन से वापस करने का प्रयास करते हैं तो समस्याएं उत्पन्न होती हैं। @ereOn की तरह, अगर आपको सटीक सलाह चाहिए तो हमें वास्तव में अधिक जानकारी चाहिए कि आप क्या करने की कोशिश कर रहे हैं। –

2

यह इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं (उदा। क्या आप स्ट्रिंग को संशोधित करना चाहते हैं)। उदाहरण देखें अधिक जानकारी के लिए http://c-faq.com/charstring/index.html

ध्यान दें कि अगर आप शाब्दिक एक स्ट्रिंग के लिए एक सूचक की घोषणा, यह const, होना चाहिए अर्थात्:

const unsigned char *tempBuffer = ""; 
+0

यदि मैं इसे 'const' बना देता हूं, तो मैं इसे बाद में नहीं जोड़ सकता ... हालांकि यह हमेशा' const' होना चाहिए? – Brian

+1

@ ब्रायन: यदि यह एक स्ट्रिंग अक्षर को इंगित करता है, तो यह स्थिर होना चाहिए। –

+1

@ ब्रायन: यदि आप "इसे बाद में जोड़ना" चाहते हैं, तो आपको वास्तव में मेमोरी बफर में अपने 'tempBuffer' को इंगित करने की आवश्यकता है, न कि एक शाब्दिक स्ट्रिंग के लिए। – KevenK

5

यह एक सूचक है के रूप में, आप या तो इस तरह पहले शून्य पर यह प्रारंभ करना चाहते हैं:

unsigned char* tempBuffer = NULL; 
unsigned char* tempBuffer = 0; 

या एक चर का एक पता निर्दिष्ट करते हैं, तो जैसे:

unsigned char c = 'c'; 

unsigned char* tempBuffer = &c; 

संपादित करें:

unsigned char myString [] = "This is my string"; 
unsigned char* tmpBuffer = &myString[0]; 
+2

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

+0

धन्यवाद टिम। तदनुसार संपादित करें। –

1

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

unsigned char * tempBuffer = NULL; 
std::vector< unsigned char > realBuffer(1024); 
tempBuffer = &realBuffer[0]; // now it really points to writable memory 
memcpy(tempBuffer, someStuff, someSizeThatFits); 
1

उत्तर इस बात पर निर्भर करता है कि आप किसके लिए हस्ताक्षरित चार का उपयोग करना चाहते हैं। एक char कुछ भी नहीं अन्यथा एक छोटा पूर्णांक है, जो सभी कार्यान्वयन के 99% पर आकार 8 बिट्स का आकार है।

सी कुछ स्ट्रिंग समर्थन होता है जो चार के साथ अच्छी तरह से फिट बैठता है, लेकिन यह चार से तारों के उपयोग को सीमित नहीं करता है।


पॉइंटर प्रारंभ करने का सही तरीका 1) इसके दायरे और 2) इसके इच्छित उपयोग पर निर्भर करता है।

यदि सूचक को स्थैतिक घोषित किया गया है, और/या फ़ाइल स्कोप पर घोषित किया गया है, तो आईएसओ सी/सी ++ गारंटी देता है कि इसे न्यूल में प्रारंभ किया गया है। प्रोग्रामिंग स्टाइल प्यूरिस्ट अभी भी अपनी शैली को स्थानीय स्कोप चर के साथ संगत रखने के लिए इसे पूर्ण पर सेट करेंगे, लेकिन सैद्धांतिक रूप से ऐसा करने के लिए व्यर्थ है।

इसके लिए इसे आरंभ करने के लिए ... इसे पूर्ण पर सेट करें। इसे "" पर इंगित करने के लिए सेट न करें, क्योंकि यह एक स्थिर डमी बाइट आवंटित करेगा जिसमें शून्य समाप्ति होती है, जो पॉइंटर को किसी अन्य चीज़ के रूप में आवंटित होने पर एक छोटी सी स्थिर स्मृति रिसाव बन जाएगी।

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

13

"ठीक से" (अपने उदाहरण के रूप में unsigned char *) एक सूचक को प्रारंभ करने के लिए आपको सिर्फ एक सरल करने की ज़रूरत

unsigned char *tempBuffer = NULL; 

आप unsigned char रों की एक सरणी को प्रारंभ करना चाहते हैं, तो आप निम्न में से कोई क्या कर सकते हैं बातें:

unsigned char *tempBuffer = new unsigned char[1024](); 
// and do not forget to delete it later 
delete[] tempBuffer; 

या

unsigned char tempBuffer[1024] = {}; 

मैं करूंगा आप संकलन समय पर बफर के आकार पता है

std::vector<unsigned char> tempBuffer(1024, 0); 
+0

http://codepad.org/DdYMIY0d –

3

:

unsigned char buffer[SIZE] = {0}; 

गतिशील आवंटित बफर (बफर के दौरान आवंटित के लिए भी std::vector<unsigned char> पर एक नज़र लेने के लिए, अगर आप इस तरह से प्रारंभ कर सकते हैं जो की सिफारिश रन-टाइम या ढेर) पर:

1.Prefer new ऑपरेटर:

unsigned char * buffer = 0; // Pointer to a buffer, buffer not allocated. 
buffer = new unsigned char [runtime_size]; 

2.Many समाधान "प्रारंभ" करने के लिए या एक साधारण मूल्य से भरना:

std::fill(buffer, buffer + runtime_size, 0); // Prefer to use STL 
memset(buffer, 0, runtime_size); 
for (i = 0; i < runtime_size; ++i) *buffer++ = 0; // Using a loop 

3. सी भाषा की ओर से एक कॉल के साथ आवंटन और आरंभीकरण प्रदान करता है।
हालांकि, फ़ंक्शन को कॉल नहीं करता वस्तु के कन्स्ट्रक्टर्स:

buffer = calloc(runtime_size, sizeof(unsigned char)) 

नोट यह भी शून्य करने के लिए बफर में सभी बिट्स सेट है कि; आपको प्रारंभिक मूल्य में कोई विकल्प नहीं मिलता है।