2009-10-08 10 views
12

Ich habe die Funktion Header gelesen, aber ich bin mir noch nicht sicher, was genau der Unterschied in Bezug auf Anwendungsfälle ist.Was ist der Unterschied zwischen memset und memcpy in C

+2

Die Header sind in der Regel nicht der beste Ort für die Dokumentation zu suchen. Im Falle von C ist die ultimative Referenz der Standard, aber jeder anständige Referenztext (z. B. K & R, H & S) sollte die Standardbibliotheksfunktionen angemessen beschreiben. – mlp

+0

http://www.cplusplus.com/ hat auch eine sehr gute Online-Referenz. – Amber

+1

oder opengroup.org (die den POSIX-Standard pflegt). Wenn Sie cplusplus.com verwenden, müssen Sie das Zeug über C++ ignorieren ... –

Antwort

34

memcpy() Kopien von einem Ort zum anderen. memset() setzt alle Speicherbereiche auf den gleichen Wert.

Beispiel:

memset(str, '*', 50); 

Die obige Linie stellt die ersten 50 Zeichen der Zeichenfolge * str (oder was auch immer zweites Argument der Memset).

memcpy(str2, str1, 50); 

Die obige Zeile kopiert die ersten 50 Zeichen von str1 nach str2.

+11

Es ist erwähnenswert, dass die Funktionen mem *() * nicht über String-Terminatoren wissen. Das zweite Beispiel oben wird schlechte Dinge tun, wenn str1 kürzer als 50 Zeichen ist. Es ist nur sicher, mem *() - Funktionen für String-Daten zu verwenden, wenn Sie die Längen bereits validiert haben. – unwind

+1

absolut. Nimm das als nur ein Beispiel. – Peter

+2

Es könnte sich herausstellen, dass, wenn Sie zwei Zeichenfolgen kopieren möchten: strncpy (str2, str1, 50); Dies kopiert sicher str1 nach str2 und stoppt die Kopie am ersten '\ 0'-String-Terminator in str1, hat aber das Sicherheitsnetz, dass es nicht mehr als 50 Zeichen kopiert, sollte str1 beschädigt sein oder länger als 50 Bytes. – EndsOfInvention

14

memset() setzt alle Bytes im angegebenen Puffer auf den gleichen Wert, memcpy() kopiert eine Bytefolge von einem anderen Ort in den Puffer.

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

Es sollte wohl erwähnt werden, dass 'sizeof (char)' 'definitionsgemäß' 1' ist, also sind die 'sizeof (char) *' s überflüssig. – emlai

+0

@ zenith sicher, für das spezifische Beispiel, aber es ist alles Spaß und Spiele, bis jemand davon ausgeht, dass Ints auch feste Größe sind. – Amber

+3

'sizeof a' und' sizeof c' bzw. sind robuster als die Verwendung einer magischen Zahl –

3

memset setzt einen Speicherblock auf einen einzelnen Wert. memcpy kopiert den Inhalt eines Blocks in einen anderen Block.

Vielleicht interessieren Sie sich für den Unterschied zwischen memcpy und memmove. Beide machen dasselbe, aber letzteres funktioniert auch, wenn sich Quelle und Ziel überschneiden.

2

memset() wird verwendet, um alle Bytes in einem Speicherblock auf einen bestimmten Zeichenwert zu setzen. Memset spielt auch nur gut mit char, da es der Initialisierungswert ist.

memcpy() kopiert Bytes zwischen Speicher. Diese Art von Daten, die kopiert werden, ist irrelevant, es werden nur Byte-für-Byte-Kopien erstellt.

0

memcpy() Kopien von einem Ort zum anderen. memset() setzt nur alle Teile des Speichers auf den gleichen.

Zum Beispiel hier String-Länge der String-Str zu * (oder was auch immer zweites Argument des Memset).

memset(str, '*', strlen(str)+1); 

Hier wird die Zeichenfolgenlänge der Zeichenfolge src in dest kopiert.

memcpy(dest, src, strlen(src)+1);

0

Memset Speicher mit konstanter Byte

void * memset (void * s, int c, size_t n) füllen;

Verwendung von memset ist Programmierer kann Speicher direkt mit bestimmten füllen. und memcpy verwendet Konstante void Zeiger auf die Quelle, die nicht geändert werden kann.

Memcpy Kopieren, um den Speicher Bereich

void * Memcpy (void * dest, src const void *, size_t n);

Referenz memcpy memset