Является ли strncpy () специализацией memcpy ()? - PullRequest
1 голос
/ 28 июня 2011

Просто интересно узнать (как мы часто используем эти функции).Я не вижу практической разницы между strncpy () и memcpy () .Разве не стоит говорить это эффективно,

char* strncpy (char *dst, const char *src, size_t size)
{
  return (char*)memcpy(dst, src, size);
}

Или я пропускаю какой-либо побочный эффект?Есть один похожий более ранний вопрос , но не удалось найти точного ответа.

Ответы [ 5 ]

8 голосов
/ 28 июня 2011

Существует разница, см. Эту часть страницы strncpy, на которую вы ссылаетесь (выделено мной):

Копирует первые num символов источника в место назначения. Если конец исходной строки C (который обозначен нулевым символом) найден до того, как скопировано num символов, место назначения заполняется нулями до общего количества num символов были написаны к нему.

Таким образом, если копируемая строка короче, чем предел, strncpy дополняется нулями, тогда как memcpy читает за предел (возможно, вызывая неопределенное поведение).

3 голосов
/ 28 июня 2011

Нет, они не одинаковы.

Из стандарта 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, то к остальному количеству N добавляются NULL-символы.

memcpy() более эффективен, но менее безопасен, так как он не проверяет источник на наличие количества N для перемещения в целевой буфер.

1 голос
/ 28 июня 2011

Помимо того, что сказали другие, тип указателей src и dst не имеет значения.То есть я могу скопировать 4-байтовое целое число в 4 последовательных символа по 1 байту следующим образом:

int num = 5;
char arr[4];
memcpy(arr, &num, 4);

Другое отличие состоит в том, что memcpy не выглядит ни в одном символе (например, NULL, по strncpy).Он слепо копирует количество байтов из источника в место назначения.

Отредактировано: правильно отформатированный код

1 голос
/ 28 июня 2011

Нет, strncpy() не является специализацией, поскольку он обнаружит символ '\0' во время копирования и остановки, что-то memcpy() не подойдет.

0 голосов
/ 28 июня 2011

Вы могли бы потенциально ускорить работу strncpy, проверив \ 0 и не копируя после этой точки. Таким образом, memcpy всегда копирует все данные, но strncpy часто будет быстрее из-за проверки.

...