Почему целая структура не может сравниться в C, но ее можно скопировать?

Почему целая структура не может сравниться в C, но ее можно скопировать? Другими словами, почему сравнение в программе ниже не работает? Он не печатает строку.

#include <stdio.h>
#include <string.h>

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);
}

Ответ 1

Вы можете использовать memcmp(). Это не очень хорошая идея в целом, хотя структуры, как правило, имеют прописные байты между полями. Прокладка используется для выравнивания поля. У вашей структуры нет ничего, кроме случайно. Это дополнение может иметь какое-либо значение, из-за чего функция memcmp() не работает, поскольку видит все байты, а не только те, которые находятся в полях.

Там больше, у вас есть строка C в структуре. Он может содержать любые байты после нулевого терминатора. Использование strcmp() в строках вернет 0, но memcmp() снова завершится неудачно, потому что он видит все байты. Указатели будут еще одним режимом отказа.

Сравнение одного поля за раз.

Ответ 2

Элементы

struct обычно выравниваются с некоторой границей, и когда вы инициализируете struct (особенно один в стеке), что-либо в байтах, пропущенных путем выравнивания, будет неинициализировано. Более того, содержимое n, прошедшее после конца инициализатора константы, не инициализируется. struct сравнение определяется как s1 == s2 выполнение memcmp(&s1, &s2, sizeof s1), тогда как struct инициализация может или не может скопировать пропущенные байты. Если вы хотите достоверно сравнить struct s, вы должны явно сравнить их элементы.

Ответ 3

Он не печатает строку.

Но он даже не компилируется:

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

Ответ 4

Помимо других правильных вещей, которые были сказаны, помните, что "сравнение" вообще не является тривиальным действием: это просто для "примитивных" базовых типов. Сложные типы (структуры в этом случае) нуждаются в перегрузке ==, но C не имеет такого понятия.

Чтобы сравнить два "объекта" (структуры), вы должны написать свою собственную функцию, которая знает, как их сравнивать, например. int compare_emp(const struct emp *, const struct emp *); или аналогичный.

Ответ 5

просто идея, набросив ее на такой тип, как void *, а затем сравнивая работу? Я думал что-то вроде

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

Ответ 6

Но если вы передадите свое значение строке, будет ли она работать?

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

в коде, который вы можете вызвать

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

Или вы можете имплицировать это:

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