比較兩個結構體時, 若結構體中含有大量的成員變量, 爲了方便, 程序員往往會直接使用memcmp對這兩個結構體進行比較, 以避免對每個成員進行分別比較。 這樣的代碼寫起來比較簡單, 然而卻很可能深藏隱患。 請看下面的示例代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct padding_type {
short m1;
int m2;
}padding_type_t;
int main()
{
padding_type_t a = {
.m1 = 0,
.m2 = 0,
};
padding_type_t b;
memset(&b, 0, sizeof(b));
if (0 == memcmp(&a, &b, sizeof(a))) {
printf("Equal!\n");
}else {
printf("No equal!\n");
}
return 0;
}
最終的結果:
# ./a.out
No equal!
爲什麼會是這樣的結果呢? 有經驗的讀者立刻就會反應過來: 這是由於對齊造成的。
沒錯! 就是因爲struct padding_type->m1的類型是short類型, 而m2的類型是int類型。 根據自然對齊規則, struct padding_type需要進行4字節對齊。 因此編譯器會在m1後面插入兩個padding字節, 而這兩個字節的內容卻是“隨機”的。 結構體b由於調用了memset對整個結構體佔用的內存進行了清零, 其padding的值自然就爲0。 這樣, 當使用memcmp對兩個結構體進行比較時, 結論就是不相同了, 即返回值不爲0。
所以, 除非在項目中可以保證所有的結構體都會使用memset來進行初始化(這個是很難保證的) , 否則就不要直接使用memcmp來比較結構體。
————————————————
原文鏈接:https://blog.csdn.net/qq_40732350/article/details/84675276