Функция
memcpy()
была первоначальной функцией в System V API для копирования блоков памяти; ее поведение для перекрывающихся блоков памяти не была подробно определена тем или иным способом. Для стандарта С 1989 г. комитет почувствовал, что это отсутствие определенности является проблемой, поэтому они придумали
memmove()
. Для обратной совместимости
memcpy()
была оставлена, причем поведение для перекрывающейся памяти было специально отмечено как неопределенное, а в качестве процедуры, корректно разрешающей проблемные случаи, была предложена
memmove()
.
Какую из них использовать в своем коде? Для библиотечной функции, которая не знает, какие области памяти ей передаются, следует использовать
memmove()
. Таким способом вы гарантируете, что не будет проблем с перекрывающимися областями. Для кода приложения, который «знает», что две области не перекрываются, можно безопасно использовать
memcpy()
.
Как для
memcpy()
, так и для
memmove()
(как и для
strcpy()
) буфер назначения является первым аргументом, а источник — вторым. Чтобы запомнить это, обратите внимание на порядок, который тот же самый, как в операторе присваивания:
dest = src;
(Справочные страницы во многих системах не помогают, предлагая прототип в виде '
void *memcpy(void *buf1, void *buf2, size_t n)
' и полагаясь на то, что текст объяснит, что есть что. К счастью, справочная страница GNU/Linux использует более осмысленные имена.)
12.2.3. Сравнение блоков памяти:
memcmp()
Функция
memcmp()
сравнивает
count
байтов из двух произвольных буферов данных. Возвращаемое ею значение подобно
strcmp()
: отрицательное, нулевое или положительное, если первый буфер меньше, равен или больше второго.
Вы можете поинтересоваться: «Почему бы не использовать для такого сравнения
strcmp()
?» Разница между двумя функциями в том, что
memcmp()
не принимает во внимание нулевые байты (завершающий строку '