Functions | |||||||||||||||||||||||||||||||||||||||||
Character manipulation | |||||||||||||||||||||||||||||||||||||||||
Conversions to and from numeric formats | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
String manipulation | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
String examination | |||||||||||||||||||||||||||||||||||||||||
Memory manipulation | |||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
Miscellaneous | |||||||||||||||||||||||||||||||||||||||||
(C11)(C11) |
Defined in header <string.h> | ||
void*memset(void*dest,int ch,size_t count); | (1) | |
void*memset_explicit(void*dest,int ch,size_t count); | (2) | (since C23) |
errno_t memset_s(void*dest, rsize_t destsz,int ch, rsize_t count); | (3) | (since C11) |
count
characters of the object pointed to bydest
.dest
is a null pointer.ch
in every location of the destination range[dest, dest+destsz) ifdest
anddestsz
are themselves valid:dest
is a null pointerdestsz
orcount
is greater thanRSIZE_MAXcount
is greater thandestsz
(buffer overflow would occur)dest
<count
<=destsz
; in other words, an erroneous value ofdestsz
does not expose the impending buffer overflow.memset_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 constant1 before including<string.h>.Contents |
dest | - | pointer to the object to fill |
ch | - | fill byte |
count | - | number of bytes to fill |
destsz | - | size of the destination array |
dest
dest
is not a null pointer anddestsz
is valid, writesdestsz
fill bytesch
to the destination array.memset
may be optimized away (under theas-if rules) if the object modified by this function is not accessed again for the rest of its lifetime (e.g.,gcc bug 8537). For that reason, this function cannot be used to scrub memory (e.g., to fill an array that stored a password with zeroes).
This optimization is prohibited formemset_explicit
andmemset_s
: they are guaranteed to perform the memory write.
Third-party solutions for that include FreeBSDexplicit_bzero
or MicrosoftSecureZeroMemory
.
#define __STDC_WANT_LIB_EXT1__ 1#include <stdio.h>#include <string.h>#include <stdlib.h> int main(void){char str[]="ghghghghghghghghghghgh";puts(str); memset(str,'a',5);puts(str); #ifdef __STDC_LIB_EXT1__ set_constraint_handler_s(ignore_handler_s);int r= memset_s(str,sizeof str,'b',5);printf("str =\"%s\", r = %d\n", str, r); r= memset_s(str,5,'c',10);// count is greater than destszprintf("str =\"%s\", r = %d\n", str, r);#endif}
Possible output:
ghghghghghghghghghghghaaaaahghghghghghghghghstr = "bbbbbhghghghghghghghgh", r = 0str = "ccccchghghghghghghghgh", r = 22
(C11) | copies one buffer to another (function)[edit] |
(C95) | copies the given wide character to every position in a wide character array (function)[edit] |
C++ documentation formemset |