Copia superficial y copia profunda en C

2 minutos de lectura

Intenté buscar en Google esto, pero solo aparecieron como resultados los lenguajes orientados a objetos.

Según tengo entendido, una copia superficial está copiando ciertos miembros de una estructura.

así que digamos que una estructura es

typedef struct node
{
    char **ok;
    int hi;
    int yep;
    struct node *next;
}node_t

copiar el char** sería una copia superficial

pero copiar toda la lista enlazada sería una copia profunda?

¿Tengo la idea correcta o estoy muy lejos? Gracias.

No. Una copia superficial en este contexto particular significa que copia “referencias” (punteros, lo que sea) a objetos, y el almacenamiento de respaldo de estas referencias o punteros es idéntico, es el mismo objeto en la misma ubicación de memoria.

Una copia profunda, por el contrario, significa que copia un objeto completo (estructura). Si tiene miembros que se pueden copiar en profundidad o en profundidad, también se hace una copia en profundidad de ellos. Considere el siguiente ejemplo:

typedef struct {
    char *name;
    int value;
} Node;

Node n1, n2, n3;

char name[] = "This is the name";

n1 = (Node){ name, 1337 };
n2 = n1; // Shallow copy, n2.name points to the same string as n1.name

n3.value = n1.value;
n3.name = strdup(n1.name); // Deep copy - n3.name is identical to n1.name regarding
                           // its *contents* only, but it's not anymore the same pointer

avatar de usuario
real52

El constructor de copia se utiliza para inicializar el nuevo objeto con el objeto creado previamente de la misma clase. Por defecto, el compilador escribió una copia superficial. La copia superficial funciona bien cuando la asignación de memoria dinámica no está involucrada porque cuando la asignación de memoria dinámica está involucrada, ambos objetos apuntarán hacia la misma ubicación de memoria en un montón. Por lo tanto, para eliminar este problema, escribimos una copia profunda para que ambos objetos tengan su propia copia de atributos. en un recuerdo Para leer los detalles con ejemplos completos y explicaciones, puede ver la parte de este artículo sobre la diferencia entre Constructores de copia superficial y profunda.

  • La publicación es específicamente sobre el lenguaje C. Los constructores y los constructores de copias son características exclusivas de C++ (y OOP). Su respuesta, aunque bien explicada, puede ser totalmente engañosa en este contexto. lo siento pero se merece votos negativos

    – kyriakosSt

    6 de abril de 2018 a las 14:45

  • De acuerdo con @kyriakosSt, Post es totalmente irrelevante para lo que ShadyBears preguntó originalmente.

    – continuar

    26 de julio de 2020 a las 8:52


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad