2009-10-08 24 views
12

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

+2

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

+0

http://www.cplusplus.com/ ha anche un ottimo riferimento online. – Amber

+1

o opengroup.org (che cura lo standard POSIX). Se usi cplusplus.com, devi ignorare le cose su C++ ... –

risposta

34

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.

+11

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

+1

assolutamente. prendi questo come solo un esempio. – Peter

+2

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

14

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| 
* +-+-+-+-+ 
*/ 
+0

Probabilmente vale la pena notare che 'sizeof (char)' è '1' per definizione, quindi' sizeof (char) * 's è ridondante. – emlai

+0

@zenith sicuro, per l'esempio specifico, ma è tutto divertimento e giochi fino a quando qualcuno non assume che anche le dimensioni siano fisse. – Amber

+3

'sizeof a' e' sizeof c' rispettivamente, sono più robusti rispetto all'uso di un numero magico –

3

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.

2

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.

0

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);

0

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);

Riferimento memcpy memset