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
Respuesta
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.
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
absolutamente. toma esto como solo un ejemplo. – Peter
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
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|
* +-+-+-+-+
*/
Probablemente vale la pena señalar que 'sizeof (char)' es '1' por definición, por lo que' sizeof (char) * 's son redundantes. – emlai
@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
'sizeof a' y' sizeof c' respectivamente, son más robustos que el uso de un número mágico –
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.
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.
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);
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);
- 1. ¿Cuál es la diferencia entre memmove y memcpy?
- 2. Diferencia entre strncpy y memcpy?
- 3. ¿Cuál es la diferencia entre Visual C++ y C++?
- 4. ¿Cuál es la diferencia entre C++ administrado y C#?
- 5. ¿Cuál es la diferencia entre Managed C++ y C++/CLI?
- 6. ¿Cuál es la diferencia entre C y C incrustado?
- 7. ¿Cuál es la diferencia entre 'int'? y 'int' en C#?
- 8. En C# ¿cuál es la diferencia entre ToUpper() y ToUpperInvariant()?
- 9. ¿Cuál es la diferencia entre File y FileInfo en C#?
- 10. ¿Cuál es la diferencia entre Process y ProcessStartInfo en C#?
- 11. ¿Cuál es la diferencia entre printf() y puts() en C?
- 12. ¿cuál es la diferencia entre atan y atan2 en C++?
- 13. ¿Cuál es la diferencia entre System.Type y System.RuntimeType en C#?
- 14. ¿Cuál es la diferencia entre strtok_r y strtok_s en C?
- 15. ¿Cuál es la diferencia entre Const y Static en C#?
- 16. Cuál es la diferencia entre & y operadores & en C#
- 17. ¿Cuál es la diferencia entre + = y = +?
- 18. ¿cuál es la diferencia entre:.! y: r !?
- 19. ¿Cuál es la diferencia entre ".equals" y "=="?
- 20. Cuál es la diferencia entre $ y jQuery
- 21. Cuál es la diferencia entre = y: =
- 22. Cuál es la diferencia entre $ (...) y `...`
- 23. ¿Cuál es la diferencia entre dict() y {}?
- 24. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 25. C++ STL :: ¿cuál es la diferencia entre inplace_merge y sort
- 26. ¿Cuál es la diferencia entre C# y .NET?
- 27. Objetivo-C: ¿Cuál es la diferencia entre forKey y forKeyPath?
- 28. ¿Cuál es la diferencia entre Ctrl-C y SIGINT?
- 29. ¿cuál es la diferencia entre -C y gzipping un mysqldump?
- 30. ¿Cuál es la diferencia entre ASP.NET y C#?
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
http://www.cplusplus.com/ también tiene una muy buena referencia en línea. – Amber
o opengroup.org (que cura el estándar POSIX). Si usas cplusplus.com, tienes que ignorar las cosas sobre C++ ... –