针对C语言中的同一结构体内容的比较、仿真

      最近在做故障保护试验,其中涉及到故障存储。逻辑是只要有新故障就存储一次,否则忽略。为了达到目的,我设计了两个结构体pre和current,开始认为代码应该如下,但是结构体内变量太多,如果逐个进行比较的话,可读性有太差,甚是苦恼。

if((pre!=current)||(current!=0))
{
    EEP_WR();
    pre = current;
}

    求助互联网,比较多的说法如下(转载https://blog.csdn.net/iteye_4537/article/details/82394349?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase

struct Student
{
int age;
double height;
};

struct s1 = { 12,26.5};
struct s2 = { 23,28.9};

struct *p1 = &s1;
struct *p2 = &s2;

比较方法:

1,元素的话,一个个比咯:if(p1->age==p2->age)...有一个元素不等,即是两个实例不相等!

2,指针直接比较,如果保存的是同一个实例地址,则(p1==p2)为真!( 强力推荐哦 )

第一种方法是被逼无奈的方法,尝试第二种。其中提到了“实例地址”,百度告诉我说这个是C++中类引用相关的概念,能使两个结构体中的地址相等。在C中没有这个概念。但是我也不死心,想进行了尝试,代码如下

typedef struct  
{
    int age;
	double height;
}Student;

Student s1, s2;
Student *p1, *p2;
LED0 = 0;
s1.age = 15;
s1.height = 1600;
s2.age = 15;
s2.height = 1600;
//    *p1 = s1;
//    *p2 = s2;
p1 = &s1;
p2 = &s2;

while (1)
{
    if (p1 != p2)
    {
        LED0 = 1;
        delay_ms(10);
    }
    else
    {
        LED0 = 0;
        delay_ms(10);
    }
}

    需要注意*p1=s1是不能用的,因为s1并不代表结构体的地址。在实际的仿真过程中,在p1和和p2内存放的是s1和s2的地址,这两个地址是无论如何也不会相等的,所以尝试失败。

    但还是不能让咱死心,百度又告诉我可以采取memcmp()函数的方式,主要是可以通过把结构体当做字符来出来,逐个比较数组地址中的所有字节。这个函数在<string.h>的标准库中。

    这个函数可用来比较字符串、数组,但是比较结构体仍然不可行。经研究,结构体在声明开辟内存的时候会默认地址对地,当结构体中涉及不同数据类型,默认地址对齐后,那些未使用的内存中数值不确定,所以不能用来比较。

    综上所述,还是老老实实的进行第一组逐个比较吧,VC还确实比较基础。


版权声明:本文为niushijia007原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。