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


memcpy_s, wmemcpy_s

Копирует байты между буферами. Здесь представлены версии memcpy, wmemcpy с усовершенствованной безопасностью, как описано в разделе Функции безопасности в CRT.

errno_t memcpy_s(
   void *dest,
   size_t numberOfElements,
   const void *src,
   size_t count 
);
errno_t wmemcpy_s(
   wchar_t *dest,
   size_t numberOfElements,
   const wchar_t *src,
   size_t count
);

Параметры

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

  • numberOfElements
    Размер буфера назначения.

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

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

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

Нуль, если успешно; код ошибки при неудаче.

Условия возникновения ошибки

dest

numberOfElements

src

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

Содержимое dest.

NULL

any

any

EINVAL

без изменений

any

any

NULL

EINVAL

dest обнулено

any

< count

any

ERANGE

dest обнулено

Заметки

memcpy_s копирует count байтов из src в dest; wmemcpy_s копирует count расширенных символов (двухбайтовых). При перекрытии исходной и конечной строк поведение инструкции memcpy_s не определено. Используйте memmove_s для обработки перекрывающихся областей.

Эти функции проверяют свои параметры. Если dest или src — нулевой указатель, или numberOfElements слишком мало для буфера, эти функции вызывают обработчик недопустимого параметра, как описано в разделе Проверка параметров. Если продолжение выполнения разрешено, эти функции возвращают EINVAL и устанавливают для errno значение EINVAL.

Требования

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

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

memcpy_s

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

wmemcpy_s

<wchar.h>

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

Пример

// crt_memcpy_s.c
// Copy memory in a more secure way.

#include <memory.h>
#include <stdio.h>

int main()
{
   int a1[10], a2[100], i;
   errno_t err;

   // Populate a2 with squares of integers
   for (i = 0; i < 100; i++)
   {
      a2[i] = i*i;
   }

   // Tell memcpy_s to copy 10 ints (40 bytes), giving
   // the size of the a1 array (also 40 bytes).
   err = memcpy_s(a1, sizeof(a1), a2, 10 * sizeof (int) );    
   if (err)
   {
      printf("Error executing memcpy_s.\n");
   }
   else
   {
     for (i = 0; i < 10; i++)
       printf("%d ", a1[i]);
   }
   printf("\n");
}
  

Эквивалент в .NET Framework

Неприменимо. Для вызова стандартной функции C используйте PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.

См. также

Ссылки

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

_memccpy

memchr, wmemchr

memcmp, wmemcmp

memmove, wmemmove

memset, wmemset

strcpy, wcscpy, _mbscpy

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l