Hablando de la realización de memcpy ()

copia de memcpy

  1. memcpy es principalmente para copiar tipos que no son cadenas.

  2. Implementación de funciones

     #include <stdio.h>
    
     void* my_memcpy(void* dest, const void*  src, size_t count)
     {
     	char* my_dest = (char*)dest;
     	const char* my_src = (char*)src;
    
     	for (int i = 0; i < count; i++)
     	{
     		my_dest[i] = my_src[i];
     	}
     }
    
  3. Un conjunto de datos de prueba

     int main()
     {
     	int str1[10] = { 1, 2, 3, 4, 5 };
     	int str2[10] = { 0 };
     	my_memcpy(str2, str1, 20);
     	for (int i = 0; i < sizeof(str2) / sizeof(int); i++)
     	{
     		printf("%d", str2[i]);
     	}
    
     	return 0;
     }
    

  En primer lugar, el valor de retorno de esta función es un vacío *. De hecho, para la mayoría de las implementaciones de funciones, el valor de retorno es este. Para poder anidar funciones, dest es el espacio de copia, porque hay varios tipos de datos como int, Char, etc., por lo que se pasa como un tipo void *, que requiere que el tipo sea coaccionado antes de su uso. Por ejemplo, en la primera y segunda líneas de la implementación de la función, src es el espacio de contenido que debe copiarse, porque este espacio no se puede modificar, por lo que puede agregar una constante al frente, el recuento es el número de bytes en el espacio de la copia, el número de bytes no puede ser negativo, por lo que puede usar size_t para declarar, generalmente cuando pasando parámetros, puede calcular directamente el número de bytes a través de sizeof.
  En el cuerpo de la función, debido a que el tipo de datos pasado es incierto, el propósito de la primera y segunda línea es convertir los datos pasados ​​en char *, lo que también se debe a que se copia una vez de acuerdo con un tipo de char durante el proceso de copia.
  Las deficiencias de la función, si hay superposición de memoria entre el contenido copiado y el espacio de destino, entonces la copia puede tener superposición de memoria. ¿Por qué es posible? Porque si la primera mitad se superpone, no afectará, si la segunda mitad se superpone, tendrá un impacto. Específicamente, el contenido copiado primero sobrescribirá el contenido que no se copió más tarde, lo que dará como resultado que el contenido copiado más tarde no sea realmente lo que desea. El contenido, la solución es copiar de atrás hacia adelante, puede consultar la implementación de la función memmove ().

Supongo que te gusta

Origin blog.csdn.net/weixin_43580319/article/details/112767514
Recomendado
Clasificación