2011-04-07 57 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 2013-06-24 19:39:33

3

的memcpy替換內存,它不追加。如果你想使用memcpy,你的代碼將需要更復雜一點。 void * memcpy(void * destination,const void * source,size_t num); void * memcpy(void * destination,const void * source,size_t num);

當您在mainbuf中傳遞時,您每次都傳遞相同的目標地址。每次使用memcpy時,都需要增加目標地址,以便將其放入後續內存中,而不是每次都覆蓋相同的字符串。

嘗試使用strcat代替它,它被設計爲將字符串連接在一起,這聽起來像你想要做的。確保在使用它之前檢查是否有足夠的內存,所以不會遇到內存問題。

1

該問題的描述聽起來像適當使用strcat。 Strcat必須小心處理,因爲它可以輕鬆地寫入緩衝區的邊界之外。出於這個原因,這裏有像strncat()這樣的變體,可以防止緩衝區溢出 - 如果使用正確。