Поделиться через


memcpy, wmemcpy

Копирует байты между буферами. Существуют более безопасные версии этих функций; см. раздел memcpy_s, wmemcpy_s.

void *memcpy(    void *dest,    const void *src,    size_t count  ); wchar_t *wmemcpy(    wchar_t *dest,    const wchar_t *src,    size_t count );

Параметры

  • dest
    Новый буфер.

  • src
    Буфер, из которого происходит копирование.

  • count
    Число копируемых символов.

Возвращаемое значение

Значение dest.

Заметки

memcpy копирует count байт из src в dest; wmemcpy копирует count расширенных символов (двухбайтовых). При перекрытии исходного и конечного буферов поведение memcpy не определено. Используйте memmove для обработки перекрывающихся областей.

Примечание о безопасностиПримечание по безопасности

Убедитесь в том, что буфер назначения равен или превосходит по размеру исходный буфер.Дополнительные сведения см. в разделе Как избежать переполнения буфера.

Примечание о безопасностиПримечание по безопасности

Так как множество выявленных случаев переполнения буфера, которые могут привести к нарушениям безопасности, было связано с ненадлежащим использованием memcpy, эта функция была включена в список "запрещенных" в рамках программы Security Development Lifecycle (SDL).Вы можете заметить, что некоторые библиотечные классы VC++ по-прежнему используют memcpy.Более того, можно заметить, что оптимизирующий компилятор VC++ иногда также вызывает функцию memcpy.Язык Visual C++ разрабатывался в соответствии с требованиями SDL, поэтому использование этой запрещенной функции тщательно анализировалось.В случае использования в библиотеке вызовы были тщательно изучены на предмет того, не могут ли они вызвать переполнение буфера.В случае с компилятором некоторые шаблоны кода были признаны идентичными шаблону memcpy и поэтому заменены на вызов функции.В таких случаях использование функции memcpy не менее безопасно, чем использование исходных инструкций, поэтому вызов функции memcpy, оптимизированной в плане производительности, является более предпочтительным.Точно так же, как использование "безопасных" функций CRT не гарантирует безопасности, использование "запрещенных" функций не обязательно приводит к опасным ситуациям (они просто требуют более внимательного подхода к обеспечению безопасности).

Так как использование функции memcpy в компиляторе VC++ и библиотеках было тщательно проанализировано, ее вызовы разрешены в коде, который в остальном соответствует процессу SDL.Вызовы memcpy в исходном коде приложений соответствуют процессу SDL, только если они были проверены специалистами по безопасности.

Функции memcpy и wmemcpy будут выведены из употребления, только если перед оператором включения определена константа _CRT_SECURE_DEPRECATE_MEMORY, показывающая, что эти функции должны быть выведены из употребления, как в примере ниже.

#define _CRT_SECURE_DEPRECATE_MEMORY
#include <memory.h>

или

#define _CRT_SECURE_DEPRECATE_MEMORY
#include <wchar.h>

Требования

Подпрограмма

Обязательный заголовок

memcpy

<memory.h> или <string.h>

wmemcpy

<wchar.h>

Дополнительные сведения о совместимости см. в разделе Совместимость во введении.

Пример

Пример использования memmove см. в разделе memcpy.

См. также

Ссылки

Манипуляция буфером

_memccpy

memchr, wmemchr

memcmp, wmemcmp

memmove, wmemmove

memset, wmemset

strcpy_s, wcscpy_s, _mbscpy_s

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l