2010-07-09 12 views
5

सी प्रोग्रामिंग में 0 या उपयोग memset के लिए पहली बाइट सेट करें, जब भी मैं पहली बार बिल्ली प्रदर्शन करने के लिए प्रयास करते हैं, मैं"रीसेट" करने के लिए पूरे बफर

TCHAR file_name[1024]; 
// Use memset or set the first byte to 0? 
file_name[0] = 0; 
_tcscat(file_name, TEMP_DIRECTORY_PATH); 
_tcscat(file_name, file); 

को मैं देख रहा हूँ सबसे प्रोग्रामर memset उपयोग कर रहे हैं की जरूरत है। लेकिन, मेरे लिए, मैंने पहले बाइट को 0 पर सेट किया है, ताकि _tcscat को कहां से शुरू किया जा सके।

मुझे यकीन नहीं है कि मेमसेट का उपयोग करने के बजाय ऐसा करने के लिए कोई कमी/जाल है या नहीं?

धन्यवाद।

उत्तर

3

आप सिर्फ पूरे सेट करते हैं कि इंगित करने के लिए 0.

करने के लिए पहले चार सेट हालांकि एक और भी आसान तरीका करने के लिए

TCHAR file_name[1024]; 
_tcsncpy(file_name, TEMP_DIRECTORY_PATH, 1024); 
_tcscat(file_name, file); 
1

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

+0

मैं असहमत हूं। तर्क में बग को छिपाने की अधिक संभावना है जो कोड को बनाए रखने के बाद अचानक पॉप अप हो जाएगा "अरे चलो इन सभी बेकार यादों को हटा दें! –

1

पूरे बफर को एनयूएल अक्षरों में सेट करना "गहराई में रक्षा" है। इस तरह की रक्षा स्रोत कोड में कहीं और गलती के लिए कवर करती है, शायद एक अलग प्रोग्रामर द्वारा। इस मामले में, गलती की गई गलती एक स्ट्रिंग की प्रतिलिपि बना रही है जो बफर फिट करती है, लेकिन एनयूएल टर्मिनेशन बाइट की प्रतिलिपि नहीं बनाती है। पहले से ही शून्य बफर इस गलत स्ट्रिंग प्रतिलिपि के लिए "उपयोग" के लिए एनयूएल को समाप्त कर देगा। प्रोग्रामर "गहराई में रक्षा" के ज्ञान पर भिन्न होते हैं क्योंकि इस तरह के कोडिंग प्रोग्रामिंग त्रुटियों को मास्क कर सकते हैं जिन्हें स्रोत कोड में फेस्टर करने की अनुमति है - उन्हें पेश किए जाने के बाद ही तय किया जा रहा है।

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

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

+0

+1 विभिन्न विकल्पों के पेशेवरों और विपक्ष के अच्छे विश्लेषण के लिए +1। –

4

मैं अधिकतर उत्तर से असहमत लगता है कि हो सकता है कर सकते हैं 0 से बफर सहायक हो सकता है। यदि आप बफर में नल-टर्मिनेटेड तारों की प्रतिलिपि बना रहे/जोड़ रहे हैं, तो पूरी चीज को साफ़ करने की कोई आवश्यकता नहीं है - ऐसा लगता है कि मुझे बर्बाद होना पड़ता है (हालांकि यह निश्चित रूप से एक अपशिष्ट हो सकता है जो चिंता करने योग्य नहीं है)।

आप दृष्टिकोण है कि Artelius suggested लेने के लिए और एक strcpy() भिन्न रूप का उपयोग बफर में प्रारंभिक स्ट्रिंग प्राप्त करने के लिए हो सकता है, लेकिन मैं strcat() `योग्यता भी है (का उपयोग कर अपने दृष्टिकोण की समरूपता लगता है, हालांकि मुझे लगता है कि बस की स्थापना 0 से पहला अक्षर पर्याप्त है)।

एक तरफ के रूप में, यदि बफर में 'सेंसिटिव' डेटा (पासवर्ड जानकारी या कुछ) हो सकता है - जो कि पूरी चीज़ को साफ़ करने का कारण हो सकता है। लेकिन अगर ऐसा है, तो http://msdn.microsoft.com/en-us/library/ms972826 पर कुछ कारणों से देखें memset() काफी पर्याप्त नहीं हो सकता है।

+0

वास्तव में? मुझे लगता है कि बफर को शून्य में सेट करना बहुत मूर्ख है, लेकिन मुझे लगता है कि मेरे उत्तर में नहीं आया। –

+0

और जो भी आप करते हैं शून्य सुरक्षित मेमोरी, इसे माइक्रोसॉफ्ट संरक्षित स्टोरेज में स्टोर न करें ... यह बात CALEA संगत है, जाहिर है। अपनी तरफ उठाओ, मुझे लगता है। –

+0

यदि आप समरूपता चाहते हैं, तो आप 'strcpy (s, "") का उपयोग कर सकते हैं; स्ट्रिंग को प्रारंभ करने के लिए "अभी भी" सभी उचित लिखने के लिए 'स्ट्रैट' का उपयोग करें। –

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