Является ли strncpy() специализацией memcpy()?
Просто любопытно узнать (как мы часто используем эти функции). Я не вижу никакой практической разницы между strncpy() и memcpy (). Разве не стоит сказать это эффективно,
char* strncpy (char *dst, const char *src, size_t size)
{
return (char*)memcpy(dst, src, size);
}
Или я пропускаю какой-либо побочный эффект? Есть еще один похожий вопрос, но он не смог найти точного ответа.
5 ответов
Есть разница, см. Эту часть strncpy
страница, на которую вы ссылаетесь (выделено мной):
Копирует первые num символов источника в место назначения. Если конец исходной строки C (который обозначен нулевым символом) найден до того, как скопировано num символов, место назначения заполняется нулями, пока в него не будет записано всего num символов.
Так что, если строка для копирования короче, чем предел, strncpy
колодки с нуля пока memcpy
читает за предел (возможно, вызывая неопределенное поведение).
Нет, они не одинаковы.
Из стандарта C (ISO / IEC 9899: 1999 (E))
7.21.2.3 Функция strcpy
Описание
2 Функция strncpy копирует не более n символов (символы, следующие за нулевым символом, не копируются) из массива, на который указывает s2, в массив, на который указывает s1.260) Если копирование происходит между объектами, которые перекрываются, поведение не определено.
3 Если массив, на который указывает s2, является строкой, которая короче, чем n символов, нулевые символы добавляются к копии в массиве, на который указывает s1, до тех пор, пока все n символов не будут записаны.
Возвращает
4 Функция strncpy возвращает значение s1.
7.21.2.1 Функция memcpy
Описание
2 Функция memcpy копирует n символов из объекта, на который указывает s2, в объект, на который указывает s1. Если копирование происходит между объектами, которые перекрываются, поведение не определено.
Возвращает 3 Функция memcpy возвращает значение s1.
когда используешь memcpy()
буферы источника и назначения могут перекрываться, в то время как в strncpy()
этого не должно случиться.
Согласно стандарту C, поведение перекрывающихся буферов не определено для обоих strncpy()
а также memcpy()
,
Согласно стандарту C, реальная разница между strncpy()
а также memcpy()
является то, что если исходная строка меньше, чем значение N, символы NULL добавляются к оставшемуся количеству N.
memcpy()
более эффективен, но менее безопасен, так как он не проверяет источник, чтобы увидеть, есть ли у него количество N для перемещения в целевой буфер.
Нет, strncpy()
это не специализация, так как он обнаружит '\0'
персонаж во время копирования и остановки, что-то memcpy()
не будет делать.
В добавление к тому, что сказали другие, тип указателей src и dst не имеет значения. То есть я могу скопировать 4-байтовое целое число в 4 последовательных символа по 1 байту следующим образом:
int num = 5;
char arr[4];
memcpy(arr, &num, 4);
Другое отличие состоит в том, что memcpy не выглядит ни в одном символе (например, NULL, от strncpy). Он слепо копирует количество байтов из источника в место назначения.
Отредактировано: правильно отформатированный код
Вы можете сделать strncpy быстрее, проверив \0 и не копируя после этой точки. Таким образом, memcpy всегда копирует все данные, но strncpy часто будет быстрее из-за проверки.