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.

Syntax

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.

By default, this function's global state is scoped to the application. To change this, see Global state in the CRT.

Requirements

Routine Required header
memmove_s <string.h>
wmemmove_s <wchar.h>

For additional compatibility information, see Compatibility.

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

See also

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