
今天咱們來聊聊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 是C庫函數,用于比較兩個內存塊的前 n 個字節。其函數原型為:
int?memcmp(const?void?*str1,?const?void?*str2,?size_t?n)
不過,用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
點贊、轉發加關注,一鍵三連,好運年年
關注公眾號后臺回復數字688或668可獲取嵌入式相關資料
往期推薦
加個變量,程序崩了

為什么C語言執行效率高,運行快?

軟考架構設計師,拿下

Keil斷點進階用法,不看后悔

