Является ли 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 часто будет быстрее из-за проверки.

Другие вопросы по тегам