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


memcpy, wmemcpy

Копирует байты между буферами. Доступны более безопасные версии этих функций; see 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, эта функция указана среди "запрещенных" функций жизненным циклом разработки безопасности (SDL). Вы можете заметить, что некоторые библиотечные классы VC++ по-прежнему используют memcpy. Более того, можно заметить, что оптимизирующий компилятор VC++ иногда также вызывает функцию memcpy. Язык Visual C++ разрабатывался в соответствии с требованиями SDL, поэтому использование этой запрещенной функции тщательно анализировалось. В случае использования в библиотеке вызовы были тщательно изучены на предмет того, не могут ли они вызвать переполнение буфера. В случае с компилятором некоторые шаблоны кода были признаны идентичными шаблону memcpy и поэтому заменены на вызов функции. В таких случаях использование функции memcpy не менее безопасно, чем использование исходных инструкций, поэтому вызов функции memcpy, оптимизированной в плане производительности, является более предпочтительным. Так же, как использование "безопасных" функций CRT не гарантирует безопасность (они просто делают его труднее быть небезопасным), использование "запрещенных" функций не гарантирует опасность (они просто требуют большего контроля, чтобы обеспечить безопасность).

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

wmemcpy Функции memcpy устарели только в том случае, если константа _CRT_SECURE_DEPRECATE_MEMORY определена перед #include инструкцией, как показано в следующих примерах:

#define _CRT_SECURE_DEPRECATE_MEMORY
#include <memory.h>

or

#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_lwcsncpy_s_mbsncpy_s,_mbsncpy_s_l