面試題:用memcmp比較結構體是否可行

比較兩個結構體時, 若結構體中含有大量的成員變量, 爲了方便, 程序員往往會直接使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章