1. 程式人生 > >memcmp比較兩個struct是否相等

memcmp比較兩個struct是否相等

struct MyStruct
{
    char a;
    int b;
};
MyStruct A, B;
memcmp(&A, &B, sizeof(MyStruct));

A和B是否可以通過memcmp來判斷是否相等。我一直以為雖然要記憶體對齊,但是a後面會補三個’\0’所以還是可以判斷是否相等的。真是迷之自信!這個問題其實最主要是考察你要知道記憶體對齊,MyStruct的實際大小是8就夠了。然後未初始化的全域性變數,static變數,編譯器會自動初始化為0。但是區域性變數的值是不確定的,必須先賦值再使用。雖然全域性變數,static變數可以不初始化,但是建議還是保持好習慣,所有的變數都要先初始化再使用!所以,這裡char a後面3個位元組不知道原本記憶體中是什麼資料,那麼A和B是沒法進行比較是否相等的!我們不妨gdb除錯看看記憶體中的情況:

MyStruct A;
A.a = 'a';
A.b = 10;

這裡寫圖片描述
這裡看到,在’a’後面3個位元組分別是’\344’ ‘\377’ ‘\377’,後面補齊的內容不確定,那麼就造成了memcmp不能判斷是否相等。
用gdb檢視記憶體
格式:x /nfu
說明:
x 是 examine 的縮寫
n 表示要顯示多少個記憶體單元
f 表示記憶體單元顯示方式,可取如下值:
x 按十六進位制格式顯示變數
d 按十進位制格式顯示變數
u 按十進位制格式顯示無符號整型
o 按八進位制格式顯示變數
t 按二進位制格式顯示變數
a 按十六進位制格式顯示變數
i 指令地址格式
c 按字元格式顯示變數
f 按浮點數格式顯示變數
u表示一個記憶體單元的長度


b 表示單位元組
h 表示雙位元組
w 表示四位元組
g 表示八位元組