使用C中的memcmp比较结构的一部分

时间:2015-09-22 04:49:04

标签: c struct memcmp

我有2个相同类型的结构,想要比较它们。结构的大小是420字节,我想在进行比较时跳过前2个字节,因为我知道它们永远不会匹配。我使用memcmp如下:

` typedef struct foo    // total of 420 bytes
{
  char c1,c2 ;
  int x ;
  struct temp y ;
  ...  // lot of other members
  ...
  ...
} ;
foo f1, f2 ;

memset (&f1, 0xff, sizeof(foo) ) ;
memset (&f2,0xff, sizeof(foo) ) ;

update_foo(&f1) ; // function which updates the structure by reading value from flash memory

// Now compare 2 structures starting with value x
if ( memcmp(&f1.x, &f2.x, sizeof(foo)-2 ) == 0 )
  // Do something
else
  // Do something else`

比较结果给出了随机值。我假设当我传递“& f1.x”和“& f2.x”时,我跳过前两个字节,比较将是剩下的418个字节。这个假设是否正确?

2 个答案:

答案 0 :(得分:1)

以可移植的方式做这件事非常困难,不同平台上的ABI可能会将每个成员填充到len,或者仅在某些情况下...所以如果我要写这个,我可能只是硬代码你感兴趣的比较...

C不是一种非常动态的语言,如果你有兴趣动态地做这样的事情,你可能会尝试类似的事情。

typedef struct
{
    int thatCanChange;
    int thatCanChange2;
    int thatICareAbout1;
    ...
    int lastThingICareAbout;
}a;

bool same( a * one, a * two)
{
    return memcmp(&(one->thatICareAbout1), &(two->thatICareAbout1), &(one->lastThingICareAbout) - &(one->thatICareAbout1) + sizeof(one->thatICareAbout1))==0;
}

答案 1 :(得分:-1)

如果您确定要跳过的内容只有两个字节,则可以使用:

memcmp(((char *)&f1) + 2, ((char *)&f2) + 2, sizeof(foo) - 2);

如果您想从x开始比较,可以使用:

memcmp(&f1.x, &f2.x, sizeof(foo)-(((char *)&f1.x) - ((char *)&f1)))

所以它适用于x之前的大小。