Почему целая структура не может сравниться в 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;
}