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 nullo
  • destsz o count è maggiore di RSIZE_MAX
  • count è maggiore di destsz (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 dest2) 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#includeintmain(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)