2011-04-07 52 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()这样的变体,可以防止缓冲区溢出 - 如果使用正确。