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

MCG*_*MCG 11 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);
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 15

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

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

一次比较一个字段.


gee*_*aur 6

struct元素通常与某个边界对齐,当您初始化 a struct(尤其是堆栈上的元素)时,对齐跳过的字节中的任何内容都将未初始化。n此外,常量初始值设定项末尾之后 的内容不会被初始化。struct比较被定义为s1 == s2doing memcmp(&s1, &s2, sizeof s1),而struct初始化可能会也可能不会复制跳过的字节。如果你想可靠地比较structs,你应该显式地比较它们的元素。