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