2011-04-07 21 views
6

मेरे पास mainbuf[bufsize] है, प्रारंभ में खाली है।memcpy का सही तरीके से उपयोग कैसे करें?

मैं कुछ इनपुट से पढ़ रहा हूं: read(fd, otherbuf, sizeof(otherbuf)) विभिन्न तार जो otherbuf को सौंपा गया है। हर बार जब मैं otherbuf पर एक नई स्ट्रिंग असाइन करता हूं, तो मैं इसे mainbuf में जोड़ना चाहता हूं।

मुझे क्या करना:

memcpy(mainbuf,otherbuf, numberofBytesReadInotherbuff) लेकिन यह मुझे सभी स्ट्रिंग्स नहीं देता है। आम तौर पर अंतिम otherbuf सही है, लेकिन अन्य सभी के पात्र वर्ण हैं।

उत्तर

18

प्रत्येक बार जब आप memcpy पर कॉल करते हैं तो गंतव्य पॉइंटर को बदलने की आवश्यकता होती है।

उदाहरण के लिए, मान लें कि आपके पास mainbuf में 4 बाइट हैं। इसके बाद आपको 10 बाइट प्राप्त होते हैं। यहां इसे जोड़ने का तरीका बताया गया है:

memcpy(mainbuf + 4, otherbuf, 10); 
+2

यह भी देखें: ['mempcpy'] (http://linux.die.net/man/3/mempcpy)। – mgalgs

3

memcpy स्मृति को प्रतिस्थापित करता है, यह संलग्न नहीं होता है। यदि आप memcpy का उपयोग करना चाहते हैं, तो आपके कोड को थोड़ा और जटिल होना चाहिए।

शून्य * memcpy (शून्य * गंतव्य, कॉन्स शून्य * स्रोत, आकार_टी संख्या);

जब आप मेनबफ में जाते हैं, तो आप हर बार एक ही गंतव्य पता पारित कर रहे हैं। जब भी आप memcpy का उपयोग करते हैं, तो आपको गंतव्य पते में वृद्धि करने की आवश्यकता होती है ताकि यह हर बार एक ही स्ट्रिंग को ओवरराइट करने के बजाय इसे बाद की स्मृति में रखे।

इसके बजाय स्ट्रैट का उपयोग करने का प्रयास करें, इसे तारों को एकसाथ जोड़ने के लिए डिज़ाइन किया गया है, जो आपको लगता है कि आप क्या करना चाहते हैं। सुनिश्चित करें कि आप जांचें कि आपके पास इसका उपयोग करने से पहले पर्याप्त स्मृति शेष है, इसलिए आपको स्मृति समस्याओं का सामना नहीं करना पड़ता है।

1

समस्या का विवरण strcat के उचित उपयोग की तरह लगता है। स्ट्रैट को देखभाल के साथ संभाला जाना चाहिए क्योंकि यह आसानी से बफर की सीमाओं से परे लिख सकता है। इसी कारण से, strncat() जैसी विविधताएं हैं जो बफर ओवररन्स को रोक सकती हैं-अगर सही तरीके से उपयोग की जाती हैं।

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