strncpy()
используется для копирования данных из источника в каталог заданного размера, копирование (заполнение) 0x00
с, если в исходном массиве (строке) до конца буфер. В отличие от strcpy
, который будет блаженно копироваться до тех пор, пока не будет найден 0
байт - даже если указанный байт находится далеко за пределами вашего буфера.
memcpy()
используется для копирования из источника в каталог независимо от того, что содержат исходные данные. Он также имеет тенденцию быть очень аппаратно оптимизированным и часто будет читать системные слова (int
с / long
с) за раз, чтобы ускорить копирование, когда выравнивание позволяет.
memmove()
используется для копирования из перекрывающейся области источника и места назначения (скажем, перемещение содержимого массива вокруг себя или чего-то подобного - отсюда и мнемоника перемещения). Он использует стратегии (например, возможно копирование данных, начиная сзади, а не спереди), чтобы защитить от проблем, вызванных перекрывающимися регионами. Это также может быть немного менее эффективно, поскольку обычно аппаратная помощь не позволяет копировать данные задом наперед.
bcopy()
и его родственники (bzero
, и несколько других) - это функция копирования байтов, которую я видел время от времени во встроенной земле. Обычно он копирует данные по одному байту за раз из источника в место назначения, чтобы предотвратить проблемы с неправильной адресацией памяти, хотя любой хороший memcpy
справится с этим, поэтому его использование довольно часто подозрительно.
Удачи!