memmove_s, wmemmove_s

Moves one buffer to another. These are versions of memmove, wmemmove with security enhancements as described in Security Features in the CRT.

errno_t memmove_s( 
   void *dest, 
   size_t numberOfElements, 
   const void *src, 
   size_t count 
);
errno_t wmemmove_s( 
   wchar_t *dest, 
   size_t numberOfElements, 
   const wchar_t *src, 
   size_t count 
);

Parameters

  • dest
    Destination object.

  • numberOfElements
    Size of the destination buffer.

  • src
    Source object.

  • count
    Number of bytes (memmove_s) or characters (wmemmove_s) to copy.

Return Value

Zero if successful; an error code on failure

Error Conditions

dest

numberOfElements

src

Return value

Contents of dest

NULL

any

any

EINVAL

not modified

any

any

NULL

EINVAL

not modified

any

< count

any

ERANGE

not modified

Remarks

Copies count bytes of characters from src to dest. If some regions of the source area and the destination overlap, memmove_s ensures that the original source bytes in the overlapping region are copied before being overwritten.

If dest or if src is a null pointer, or if the destination string is too small, these functions invoke an invalid parameter handler, as described in Parameter Validation . If execution is allowed to continue, these functions return EINVAL and set errno to EINVAL.

Requirements

Routine

Required header

memmove_s

<string.h>

wmemmove_s

<wchar.h>

For additional compatibility information, see Compatibility in the Introduction.

Example

// crt_memmove_s.c
//
// The program demonstrates the 
// memmove_s function which works as expected
// for moving overlapping regions.

#include <stdio.h>
#include <string.h>

int main()
{
   char str[] = "0123456789";

   printf("Before: %s\n", str);

   // Move six bytes from the start of the string
   // to a new position shifted by one byte. To protect against
   // buffer overrun, the secure version of memmove requires the
   // the length of the destination string to be specified. 

   memmove_s((str + 1), strnlen(str + 1, 10), str, 6); 

   printf_s(" After: %s\n", str);
}

Output

Before: 0123456789
 After: 0012345789

.NET Framework Equivalent

System::Buffer::BlockCopy

See Also

Reference

Buffer Manipulation

_memccpy

memcpy, wmemcpy

strcpy_s, wcscpy_s, _mbscpy_s

strcpy, wcscpy, _mbscpy

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l