2009-10-08 42 views
12

He leído los encabezados de las funciones, pero aún no estoy seguro de cuál es exactamente la diferencia en términos de casos de uso.Cuál es la diferencia entre memset y memcpy en C

+2

Las cabeceras no son generalmente el mejor lugar para buscar documentación. En el caso de C, la referencia última es el Estándar, pero cualquier texto de referencia decente (por ejemplo, K & R, H & S) debe describir adecuadamente las funciones de la biblioteca estándar. – mlp

+0

http://www.cplusplus.com/ también tiene una muy buena referencia en línea. – Amber

+1

o opengroup.org (que cura el estándar POSIX). Si usas cplusplus.com, tienes que ignorar las cosas sobre C++ ... –

Respuesta

34

memcpy() copias de un lugar a otro. memset() simplemente establece todas las piezas de memoria con el mismo valor.

Ejemplo:

memset(str, '*', 50); 

La línea anterior establece los primeros 50 caracteres de la cadena str a * (o lo que sea segundo argumento de la memset).

memcpy(str2, str1, 50); 

La línea de arriba copia los primeros 50 caracteres de str1 a str2.

+11

Vale la pena señalar que las funciones mem *() * no * saben sobre los terminadores de cadena. El segundo ejemplo anterior hará cosas malas si str1 es más corto que 50 caracteres. Solo es seguro usar las funciones mem *() en datos de cadena cuando ya ha validado las longitudes involucradas. – unwind

+1

absolutamente. toma esto como solo un ejemplo. – Peter

+2

valdría la pena señalar que si desea copiar dos cadenas use: strncpy (str2, str1, 50); Copiará de forma segura str1 a str2 deteniendo la copia en el primer terminador de cadena '\ 0' que detecte en str1, pero tiene la red de seguridad que no copiará más de 50 caracteres si str1 está dañado o tiene más de 50 bytes. – EndsOfInvention

14

memset() establece todos los bytes en el búfer especificado con el mismo valor, memcpy() copia una secuencia de bytes de otro lugar en el búfer.

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

Probablemente vale la pena señalar que 'sizeof (char)' es '1' por definición, por lo que' sizeof (char) * 's son redundantes. – emlai

+0

@zenith seguro, para el ejemplo específico, pero es todo diversión y juegos hasta que alguien asuma que los enteros son de tamaño fijo también. – Amber

+3

'sizeof a' y' sizeof c' respectivamente, son más robustos que el uso de un número mágico –

3

memset establece un bloque de memoria a un solo valor. memcpy copia el contenido de un bloque en otro bloque.

Quizás le interese la diferencia entre memcpy y memmove. Ambos hacen lo mismo, pero el último funciona incluso si la fuente y el destino se superponen.

2

memset() se utiliza para establecer todos los bytes en un bloque de memoria a un valor de char particular. Memset también solo funciona bien con char ya que es su valor de inicialización.

memcpy() copia los bytes entre la memoria. Este tipo de datos que se copian es irrelevante, solo hace copias de byte por byte.

0

memcpy() copias de un lugar a otro. memset() simplemente establece todas las piezas de memoria al mismo.

Por ejemplo, aquí establece la longitud de cadena de la cadena str a * (o cualquier segundo argumento del memset).

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

Aquí copia la longitud de la cadena de la cadena src a dest.

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

0

memset llenar memoria con byte constante

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

El uso de memset es un programador que puede llenar directamente la memoria con particularidad. y memcpy utiliza constante puntero de vacío a la fuente que no se puede cambiar.

memcpy copiar el memoria área

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

Referencia memcpy memset

Cuestiones relacionadas