Vogliamo mostrarti le migliori informazioni che possiamo trovare online. La nostra speranza è che tu lo trovi utile e se vuoi parlarci di qualsiasi dettaglio che potrebbe aiutarci a migliorare le nostre informazioni, fallo liberamente.
Definito nell'intestazione
|
||
---|---|---|
void*memset(void*dest,int ch,size_t count ); |
(1) | |
errno_tmemset_s(void*dest,rsize_t destsz,int ch,rsize_t count ); |
(2) | (da C11) |
1) Copia il valore ch
(dopo la conversione in unsigned char
come da (unsigned char)ch
) in ciascuno dei primi count
dell'oggetto puntato da dest
.
Il comportamento non è definito se l'accesso avviene oltre la fine dell'array dest. Il comportamento non è definito se dest
è un puntatore nullo.2) Come (1) tranne che per il fatto che i seguenti errori vengono rilevati in fase di esecuzione e chiamano la funzione di gestione dei vincoli attualmente installata dopo la memorizzazione di ch
in ogni posizione dell'intervallo di destinazione [dest, dest+destsz)
se dest
e destsz
sono a loro volta validi:
dest
è un puntatore nullodestsz
ocount
è maggiore diRSIZE_MAX
count
è maggiore didestsz
(si verificherebbe un overflow del buffer)
Il comportamento è indefinito se la dimensione dell'array di caratteri puntato da dest
count
<= destsz
; in altre parole, un valore errato di destsz
non rivela l'imminente overflow del buffer. Come per tutte le funzioni con controllo dei limiti, memset_s
è garantito solo se __STDC_LIB_EXT1__
è definito dall'implementazione e se l'utente definisce __STDC_WANT_LIB_EXT1__
alla costante intera 1 prima di includere string.h
.
Parametri
destinazione | - | puntatore all'oggetto da riempire |
ch | - | byte di riempimento |
conteggio | - | numero di byte da riempire |
destsz | - | dimensione dell'array di destinazione |
Valore di ritorno
1) Una copia di dest
2) zero in caso di successo, non zero in caso di errore. Anche in caso di errore, se dest
non è un puntatore nullo e destsz
è valido, scrive destsz
riempire i byte ch
nell'array di destinazione.
Note
memset
può essere ottimizzato (sotto l'opzione as-if ) se l'oggetto modificato da questa funzione non viene consultato di nuovo per il resto della sua vita (ad es. bug gcc 8537). Per questo motivo, questa funzione non può essere utilizzata per pulire la memoria (ad esempio, per riempire di zeri un array che contiene una password). Questa ottimizzazione è vietata per memset_s
: è garantita l'esecuzione della scrittura della memoria. Le soluzioni di terze parti includono FreeBSD explicit_bzero o Microsoft SecureZeroMemory.
Esempio
#define__STDC_WANT_LIB_EXT1__1#include#include #include intmain(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 = %dn", str, r); r =memset_s(str,5,'c',10);// count is greater than destsz printf("str = "%s", r = %dn", str, r);#endif}
Possibile uscita:
ghghghghghghghghghghgh aaaaahghghghghghghghgh str ="bbbbbhghghghghghghghgh", r =0 str ="ccccchghghghghghghghgh", r =22
Riferimenti
- Norma C11 (ISO/IEC 9899:2011):
- 7.24.6.1 La funzione memset (p: 371)
- K.3.7.4.1 La funzione memset_s (p: 621-622)
- Standard C99 (ISO/IEC 9899:1999):
- 7.21.6.1 La funzione memset (p: 333)
- Norma C89/C90 (ISO/IEC 9899:1990):
- 4.11.6.1 La funzione memset
Vedi anche
memcpymemcpy_s(C11) | copia un buffer in un altro (funzione) |
wmemset(C95) | copia il carattere largo dato in ogni posizione di un array di caratteri larghi (funzione) |
Ti mostriamo commenti e valutazioni
Apprezziamo che tu voglia supportare la nostra funzione mettendo un commento o lasciando un punteggio, ti saremo eternamente grati.