Как правильно использовать memcpy? - PullRequest
9 голосов
/ 08 апреля 2011

У меня есть mainbuf[bufsize], изначально пусто.

Я читаю из некоторого ввода: read(fd, otherbuf, sizeof(otherbuf)) различные строки, которые назначены на otherbuf. Каждый раз, когда я присваиваю новую строку otherbuf, я хочу добавить ее к mainbuf.

Я делаю:

memcpy(mainbuf,otherbuf, numberofBytesReadInotherbuff) но это не дает мне все условия. Обычно последний otherbuf является правильным, но во всех остальных отсутствуют символы.

Ответы [ 3 ]

19 голосов
/ 08 апреля 2011

Вам нужно менять указатель назначения каждый раз, когда вы вызываете memcpy.

Например, предположим, что у вас есть 4 байта в mainbuf сейчас.Далее вы получите 10 байтов.Вот как это добавить:

memcpy(mainbuf + 4, otherbuf, 10);
3 голосов
/ 08 апреля 2011

memcpy заменяет память, не добавляет.Если вы хотите использовать memcpy, ваш код должен быть немного более сложным.

void * memcpy (void * destination, const void * source, size_t num);

Когда вы передаетев mainbuf вы передаете один и тот же адрес назначения каждый раз.Вам нужно увеличивать адрес получателя каждый раз, когда вы используете memcpy, чтобы он помещал его в последующую память, вместо того, чтобы каждый раз перезаписывать одну и ту же строку.

Попробуйте вместо этого использовать strcat, он предназначен для объединения строк, что звучиткак то, что вы хотите сделать.Перед использованием убедитесь, что у вас осталось достаточно памяти, чтобы не возникало проблем с памятью.

1 голос
/ 08 апреля 2011

Описание проблемы звучит как правильное использование strcat.С Strcat нужно обращаться осторожно, поскольку он может легко записывать за пределы буфера.По этой причине вот такие варианты, как strncat(), которые могут предотвратить переполнение буфера - при правильном использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...