电子产业一站式赋能平台

PCB联盟网

搜索
查看: 227|回复: 0
收起左侧

C语言如何判断结构体相等?

[复制链接]

570

主题

570

帖子

6855

积分

高级会员

Rank: 5Rank: 5

积分
6855
发表于 2024-11-21 11:52:00 | 显示全部楼层 |阅读模式
关注+星标公众,不错过精彩内容来源 | typedef
嵌入式编程时,结构体是我们常用的一种语法,今天就来聊聊C语言如何判断结构体相等?

编程中结构体的重要性今天咱们来聊聊C语言里的结构体。这玩意儿就像是搭积木,能把你想要的各种数据类型一块儿凑起来,变成一个有意义的“小团伙”。如果你还没搞懂结构体,那就赶紧翻翻我之前的文章吧!C语言结构体(struct)用法详解
说到比较两个结构体,咱们常用的办法有两种:逐个成员比一比,或者用memcmp来个大扫荡。接下来,就让咱们详细瞅瞅这两种办法咋实现的,还有它们的小毛病。
逐成员比较逐个成员比较,这法子简单又好用。比如说有这么一个结构体,里面有 int、float、指针类型的数据,咱们来看看怎么挨个比一比:
#include
#include
#include
#include
typedef struct {
  int a;
  float b;
  char *d;
} MyStruct;
#define EPSILON 0.000001
bool FloatsIsEqual(float f1, float f2) {
  return fabs(f1 - f2) bool compareStructs(MyStruct s1, MyStruct s2) {
  if (s1.a != s2.a) return false;
  if (!FloatsIsEqual(s1.b, s2.b)) return false;
  if (strcmp(s1.d, s2.d) != 0) return false;
  return true;
}
int main() {
  MyStruct s1 = {520, 2.5f, "typedef"};
  MyStruct s2 = {520, 2.5f, "typedef"};
  if (compareStructs(s1, s2)) {
    printf("Structures are equal");
  } else {
    printf("Structures are not equal");
  }
  return 0;
}
memcmp比较memcmp 是C库函数,用于比较两个内存块的前 n 个字节。其函数原型为:
int memcmp(const void *str1, const void *str2, size_t n)
  • 参数
  • str1 -- 指向内存块的指针。
  • str2 -- 指向内存块的指针。
  • n -- 要被比较的字节数。
  • 返回值
  • 如果返回值
  • 如果返回值 > 0,则表示 str1 大于 str2。
  • 如果返回值 = 0,则表示 str1 等于 str2。不过,用memcmp的时候可得小心:
  • 结构体对齐:由于结构体可能存在内存对齐的情况,会填充一些字节,此时直接使用 memcmp 可能会得到错误的结果。
  • 浮点数比较:浮点数的存储方式特殊,直接使用 memcmp 比较可能会导致不准确的结果。反面教材在这里我我亲身经历的Bug,有一段代码是通过逐成员方式比较两个结构体是否相等的,然后我就耍小聪明改为使用 memcmp 的方式,结果不出意外的情况下还是出现了意外。
    以下是一个示例,展示了使用 memcmp 比较包含正零和负零的两个结构体变量:
    #include
    #include
    typedef struct {
      float value;
    }FloatStruct;
    int main() {
      FloatStruct s1 = {0.0f}; // 正零
      FloatStruct s2 = {-0.0f}; // 负零
      if (memcmp(&s1, &s2, sizeof(FloatStruct)) == 0) {
        printf("Structures are equal");
      } else {
        printf("Structures are not equal");
      }
      return 0;
    }
    虽然两个结构体成员在数值上是相等的,两者都是0,但是在存储格式中的符号位却不相同,从而存储在在内存中的数据不同,所以判断为两个结构体不相等,跟我们期待的结果相悖。
    总结要是结构体里有浮点型数据或者指针类型的数据,咱们就用逐个成员比较的办法,简单好用。要是就一些简单的整形数据,使用memcmp也能偷偷懒。
    为了程序的可扩展性,还是建议使用逐一成员比较。
    声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。------------ END ------------

    c3bagmdh0jz64012511801.gif

    c3bagmdh0jz64012511801.gif


    ●专栏《嵌入式工具
    ●专栏《嵌入式开发》
    ●专栏《Keil教程》
    ●嵌入式专栏精选教程

    关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
    点击“阅读原文”查看更多分享。
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表