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_l
wcsncpy_s
_mbsncpy_s
,_mbsncpy_s_l