为什么整个结构无法在C中进行比较,但它可以被复制?

时间:2011-06-26 18:40:38

标签: 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);
}

6 个答案:

答案 0 :(得分:15)

您可以使用memcmp()。虽然这不是一个好主意,但结构往往在字段之间有填充字节。填充用于对齐场。你的结构没有任何,但这是偶然的。填充可以有任何类型的值,使得memcmp()无法工作,因为它可以看到所有字节,而不仅仅是字段中的字节。

还有更多,你在结构中有一个C字符串。它可以包含零终止符之后的任何类型的字节。在字符串上使用strcmp()将返回0,但memcmp()再次失败,因为它看到所有字节。指针将是另一种失败模式。

一次比较一个字段。

答案 1 :(得分:4)

struct元素通常与某些边界对齐,当您初始化struct(尤其是堆栈中的一个)时,通过对齐跳过的字节中的任何内容都将是未初始化的。此外,不会初始化在常量初始值设定项结束之后n的内容。 struct比较定义为s1 == s2执行memcmp(&s1, &s2, sizeof s1),而struct初始化可能会也可能不会复制跳过的字节。如果您想要可靠地比较struct,您应该明确地比较它们的元素。

答案 2 :(得分:1)

  

它不打印字符串。

但它甚至没有编译:

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

答案 3 :(得分:0)

除了已经说过的其他正确的事情之外,请记住“比较”通常不是一个微不足道的行动:它只是针对“原始”的基本类型。复杂类型(在这种情况下是结构)需要重载==,但C没有这样的概念。

为了比较两个“对象”(结构),你必须编写自己的函数,知道如何比较它们,例如int compare_emp(const struct emp *, const struct emp *);或类似的。

答案 4 :(得分:-1)

只是一个想法,将它转换为类型如void *然后比较工作? 我在想像

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

答案 5 :(得分:-1)

但是如果将值传递给字符串,它会起作用吗?

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