void* memcpy( void *dest, const void *src, size_t count );
| (until C99) | |
void* memcpy( void *restrict dest, const void *restrict src, size_t count );
| (since C99) | |
errno_t memcpy_s( void *restrict dest, rsize_t destsz, const void *restrict src, rsize_t count ); | (2) | (since C11) |
| | |
1) Copies
count
characters from the object pointed to by src
to the object pointed to by dest
. Both objects are interpreted as arrays of unsigned char.
The behavior is undefined if access occurs beyond the end of the dest array. If the objects overlap (which is a violation of the restrict contract) (since C99), the behavior is undefined. The behavior is undefined if either
dest
or src
is a null pointer.
2) Same as (1), except that the following errors are detected at runtime and cause the entire destination range [dest, dest+destsz) to be zeroed out (if both
dest
and destsz
are valid), as well as call the currently installed constraint handler function:
-
dest
orsrc
is a null pointerdestsz
orcount
is greater than RSIZE_MAXcount
is greater thandestsz
(buffer overflow would occur)- the source and the destination objects overlap
The behavior is undefined if the size of the character array pointed to by
dest
< count
<= destsz
; in other words, an erroneous value of destsz
does not expose the impending buffer overflow.
-
As all bounds-checked functions,
memcpy_s
is only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1before includingstring.h
. -
- 相较于memcpy,memcpy_s会检查:
-
1) dest、src的合法性;
- 2)检查destsz、count的合法性;
- 3)检查缓存异常的风险;
- 4)检查目的buf和源buf是否存在内存覆盖。