struct Flat {
int a1;
int a2;
}
// a hierarchical struct which containing a struct attribute
struct NonFlat {
Flat b1;
int b2;
}
Flat f1, f2;
memcmp (&f1, &f2, sizeof f1)
在我的编译器中,它有效,意思是
f1.a1 == f2.a1,f1.a2 == f2.a2< => memcmp(f1,f2)== 0;
NonFlat n1, n2;
memcmp (&n1, &n2, sizeof n1) // does it also work for non-flat structs, considering the padding?
我认为它也适用于NonFlat结构。但是,在我的编译器中,对于非平面结构,即使成员属性相等,memcmp的结果也表明它们是不同的。
答案 0 :(得分:5)
C库函数memcmp对内存位置进行逐字节比较。正如@MSalters正确指出的那样,这种比较将包括任何和所有填充字节。
对于任何平坦或不平坦的定义,您不关心您的结构是扁平的还是非扁平的。它并不关心或了解结构语义。
如果字节相等,则返回true。否则返回false。
这意味着,对于其成员在内存中连续放置的任何结构,如果所有字段都匹配,它将匹配。对于任何带有指向内存中其他位置的指针的结构,它不会按照这些指针来查看它们指向的内存是否匹配,而只是查看存储在指针中的文字地址,看看它是否匹配。
答案 1 :(得分:4)
你的结构是扁平的。
非平面结构有指针。
此外,您还没有初始化这些结构。