¿Por qué no se puede comparar toda la estructura en C, pero se puede copiar?

¿Por qué no se puede comparar toda la estructura en C y se puede copiar? En otras palabras, ¿Por qué la comparación en el siguiente progtwig no funciona? No imprime cadena.

#include  #include  int main(void) { struct emp { char n[20]; int age; }; struct emp e1={"David",23}; struct emp e2=e1; if(e2 == e1) { printf("The structures are equal"); } return(0); } 

Podrías usar memcmp (). Aunque no es una buena idea en general, las estructuras tienden a tener bytes de relleno entre los campos. El relleno se utiliza para alinear el campo. Tu estructura no tiene ninguna pero eso es por accidente. Ese relleno puede tener cualquier tipo de valor, haciendo que memcmp () no funcione porque ve todos los bytes, no solo los que están en los campos.

Hay más, tienes una cadena en C en la estructura. Puede contener cualquier tipo de bytes más allá del terminador cero. El uso de strcmp () en las cadenas devolvería 0 pero memcmp () nuevamente falla porque ve todos los bytes. Los punteros serían otro modo de fallo.

Compara un campo a la vez.

struct elementos de struct suelen estar alineados con algún límite, y cuando se inicializa una struct (especialmente una en la stack), cualquier cosa en los bytes omitidos por alineación quedará sin inicializar. Además, el contenido de n pasado el final del inicializador constante no se inicializa. struct comparación de struct se define como s1 == s2 haciendo memcmp(&s1, &s2, sizeof s1) , mientras que la inicialización de struct puede o no copiar los bytes omitidos. Si desea comparar struct manera confiable, debe comparar explícitamente sus elementos.

No imprime cadena.

Pero ni siquiera comstack:

 error: invalid operands to binary == (have 'struct emp' and 'struct emp') 

Más allá de otras cosas correctas que se han dicho, recuerde que “comparar” en general no es una acción trivial: es tan solo para los tipos básicos “primitivos”. Los tipos complejos (estructuras en este caso) necesitarían una sobrecarga ==, pero C no tiene tal concepto.

Para poder comparar dos “objetos” (estructuras), debe escribir su propia función que sepa compararlos, por ejemplo, int compare_emp(const struct emp *, const struct emp *); o similar.

solo una idea, ¿lo convertiría en un tipo como void * y luego compararía el trabajo? Estaba pensando algo como

  struct emp e1 = { "David",23 }; struct emp e2 = e1; if (*((void*)&e1) == *((void*)&e2)) { /* pure evil? I think not :3*/ } 

Pero si pasas tu valor a una cadena, ¿funcionará?

 void Comparethisvalue(emp a, emp b) { if(antostring()+a.age.tostring() == bntostring()+b.age.tostring()) return true; } 

en codigo puedes llamar

 if(Comparethisvalue(e1, e2)) { //do something } 

O puedes hacerlo implícitamente:

 void Comparethisvalue(emp a, emp b) { if(an == bn && a.age == b.age) return true; }