1

我有 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 个字节。这个假设正确吗?

4

2 回答 2

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;
}
于 2015-09-22T05:21:51.710 回答
-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

于 2015-09-22T05:16:14.397 回答