Copia superficial y copia profunda en C

Intenté googlear esto, pero solo los lenguajes orientados objetados emergen como resultados.

A mi entender, 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 la lista enlazada completa sería una copia profunda?

¿Tengo la idea correcta o estoy lejos? Gracias.

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

Una copia profunda, en contraste, significa que usted copia un objeto completo (estructura). Si tiene miembros que pueden copiarse de forma superficial o profunda, también puede hacer una copia profunda 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 

El constructor de copia se utiliza para inicializar el nuevo objeto con el objeto creado anteriormente de la misma clase. Por defecto el comstackdor escribió una copia superficial. La copia superficial funciona bien cuando la asignación de memoria dinámica no está involucrada porque cuando se trata de una asignación de memoria dinámica, ambos objetos apuntarán hacia la misma ubicación de memoria en un montón. en un recuerdo. Para leer los detalles con ejemplos completos y explicaciones, puede ver la parte de este artículo sobre la diferencia entre los constructores de copia superficial y profunda .