Ho letto le intestazioni delle funzioni, ma non sono ancora sicuro di quale sia esattamente la differenza in termini di casi d'uso.Qual è la differenza tra memset e memcpy in C
risposta
memcpy()
copie da un luogo all'altro. memset()
imposta semplicemente tutti i pezzi di memoria sullo stesso valore.
Esempio:
memset(str, '*', 50);
La riga precedente imposta i primi 50 caratteri della stringa str a * (o qualsiasi secondo argomento della memset).
memcpy(str2, str1, 50);
La riga precedente copia i primi 50 caratteri di str1 in str2.
Vale la pena sottolineare che le funzioni mem *() * non * sono a conoscenza dei terminatori di stringhe. Il secondo esempio sopra farà cose cattive se str1 è più corto di 50 caratteri. È sicuro utilizzare le funzioni mem *() sui dati di stringa solo dopo aver convalidato le lunghezze coinvolte. – unwind
assolutamente. prendi questo come solo un esempio. – Peter
potrebbe essere utile sottolineare che se si desidera copiare due stringhe utilizzare: strncpy (str2, str1, 50); Questo copia in modo sicuro da str1 a str2 che interrompe la copia nel primo terminatore di stringa '\ 0' rilevato in str1, ma ha la rete di sicurezza che non copierà più di 50 caratteri se str1 sarà corrotto o più lungo di 50 byte. – EndsOfInvention
memset()
imposta tutti i byte nel buffer specificato sullo stesso valore, memcpy()
copia una sequenza di byte da un altro posto nel buffer.
char a[4];
memset(a, 7, sizeof(char)*4);
/*
* a is now...
*
* +-+-+-+-+
* |7|7|7|7|
* +-+-+-+-+
*/
char b[] = {1,2,3,4};
char c[4];
memcpy(c, b, sizeof(char)*4);
/*
* c is now...
*
* +-+-+-+-+
* |1|2|3|4|
* +-+-+-+-+
*/
Probabilmente vale la pena notare che 'sizeof (char)' è '1' per definizione, quindi' sizeof (char) * 's è ridondante. – emlai
@zenith sicuro, per l'esempio specifico, ma è tutto divertimento e giochi fino a quando qualcuno non assume che anche le dimensioni siano fisse. – Amber
'sizeof a' e' sizeof c' rispettivamente, sono più robusti rispetto all'uso di un numero magico –
memset
imposta un blocco di memoria su un valore singolo. memcpy
copia il contenuto di un blocco in un altro blocco.
Forse ti interesserebbe la differenza tra memcpy
e memmove
. Entrambi fanno lo stesso, ma quest'ultimo funziona anche se l'origine e la destinazione si sovrappongono.
memset()
viene utilizzato per impostare tutti i byte in un blocco di memoria su un valore di char particolare. Memset funziona anche bene solo con char
poiché è il suo valore di inizializzazione.
memcpy()
copie di byte tra la memoria. Questo tipo di dati copiati è irrilevante, crea solo copie byte per byte.
memcpy()
copie da un luogo all'altro. memset()
imposta semplicemente tutti i pezzi di memoria sullo stesso.
Ad esempio qui imposta la lunghezza della stringa della stringa str su * (o qualunque altro argomento del memset).
memset(str, '*', strlen(str)+1);
Qui copia la lunghezza della stringa della stringa src in dest.
memcpy(dest, src, strlen(src)+1);
memset occupare memoria con costante byte
void * memset (s void *, int c, size_t n);
L'utilizzo di memset è il programmatore in grado di riempire direttamente la memoria con particolare. e memcpy utilizza costante puntatore vuoto all'origine che non può essere modificato.
memcpy copiare il memoria zona
void * memcpy (void * dest, const void * src, size_t n);
Le intestazioni di solito non sono il posto migliore per cercare la documentazione. Nel caso di C, il riferimento finale è lo standard, ma qualsiasi testo di riferimento decente (ad esempio K & R, H & S) dovrebbe descrivere adeguatamente le funzioni di libreria standard. – mlp
http://www.cplusplus.com/ ha anche un ottimo riferimento online. – Amber
o opengroup.org (che cura lo standard POSIX). Se usi cplusplus.com, devi ignorare le cose su C++ ... –