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

2021-10-04 18:50:34 字數 882 閱讀 7289

比較兩個結構體時, 若結構體中含有大量的成員變數, 為了方便, 程式設計師往往會直接使用memcmp對這兩個結構體進行比較, 以避免對每個成員進行分別比較。 這樣的**寫起來比較簡單, 然而卻很可能深藏隱患。 請看下面的示例**:

#include

#include

#include

typedef

struct padding_type padding_type_t;

intmain()

; padding_type_t b;

memset

(&b,0,

sizeof

(b));if

(0==memcmp

(&a,

&b,sizeof

(a))

)else

return0;

}

最終的結果:

# ./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來比較結構體。

————————————————

比較難的面試題

比較難的面試題 問 如果你要為客戶寫乙個函式 軟體開發客戶 該函式用來處理乙個陣列 入口是這樣的void test int p 在函式中將要對該陣列進行操作,情況有2種 1 送入的陣列是靜態分配的 2 送入的陣列是動態分配 如malloc 的 那如何去判斷這兩種分配情況呢 wanguodu 足文字d...

mysql資料結構面試題 MySQL 面試題

mysql 的一些面試題,有的是平時聊到的,有的是聽別人說的,有的是工作中遇到的,特此彙總一下,有問有答。一條 sql 查詢語句執行流程?1 聯結器。客戶端和伺服器 tcp 握手後,驗證使用者名稱密碼。使用者名稱密碼通過後,聯結器會到許可權表中查詢你擁有的許可權。之後這個連線裡面的許可權判斷邏輯,都...

java比較難面試題 一

題目二 60.執行以下程式,控制台將列印 public examtest class animal publicstring getdesc public string tostring class wolf extends animal publicstring getdesc 列印結果是 wol...