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 从 src 复制 count 字节到 dest; wmemcpy_s 复制 count 个宽字符 (两个字节)。 如果源和目标字符串重叠,则 memcpy_s 的行为未定义。 使用 memmove_s 处理重叠区域。

这些函数验证其参数。 如果 dest 或 src 为 null 指针,或 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