为什么整个结构无法在C中进行比较,但它可以被复制?
为什么整个结构无法在C中进行比较但是可以复制? 换句话说,为什么下面的程序比较不起作用? 它不打印字符串。
#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); }
你可以使用memcmp()。 虽然这不是一个好主意,但结构往往在字段之间有填充字节。 填充用于对齐场。 你的结构没有任何,但这是偶然的。 该填充可以具有任何类型的值,使得memcmp()无法工作,因为它可以看到所有字节,而不仅仅是字段中的字节。
还有更多,你在结构中有一个C字符串。 它可以包含零终止符之后的任何类型的字节。 在字符串上使用strcmp()将返回0,但memcmp()再次失败,因为它看到所有字节。 指针将是另一种失败模式。
一次比较一个字段。
struct
元素通常与某些边界对齐,当您初始化一个struct
(尤其是堆栈中的一个)时,通过对齐跳过的字节中的任何内容都将是未初始化的。 此外,不会初始化常量初始化器结束时的n
的内容。 struct
comparison定义为s1 == s2
执行memcmp(&s1, &s2, sizeof s1)
,而struct
初始化可能会也可能不会复制跳过的字节。 如果要可靠地比较struct
,则应明确比较它们的元素。
它不打印字符串。
但它甚至没有编译:
error: invalid operands to binary == (have 'struct emp' and 'struct emp')
除了已经说过的其他正确的事情之外,请记住“比较”通常不是一个微不足道的动作:它只是针对“原始”的基本类型。 复杂类型(在这种情况下是结构)需要重载==,但C没有这样的概念。
为了比较两个“对象”(结构),你必须编写自己的函数,知道如何比较它们,例如int compare_emp(const struct emp *, const struct emp *);
或类似的。
只是一个想法,将它转换为类型如void *然后比较工作? 我在想类似的东西
struct emp e1 = { "David",23 }; struct emp e2 = e1; if (*((void*)&e1) == *((void*)&e2)) { /* pure evil? I think not :3*/ }
但是,如果将值传递给字符串,它会起作用吗?
void Comparethisvalue(emp a, emp b) { if(antostring()+a.age.tostring() == bntostring()+b.age.tostring()) return true; }
在代码中你可以打电话
if(Comparethisvalue(e1, e2)) { //do something }
或者你可以暗示这样做:
void Comparethisvalue(emp a, emp b) { if(an == bn && a.age == b.age) return true; }