還是深信服的題目,連續(xù)兩輪技術(shù)面試,都反復問到這個問題。雖然說是考察內(nèi)存對齊的點,但是被我自己聰明反被聰明誤了。比如:
struct MyStruct{    char a;    int b;};MyStruct A, B;memcmp(&A, &B, sizeof(MyStruct));A和B是否可以通過memcmp來判斷是否相等。我當時脫口而出,雖然要內(nèi)存對齊,但是a后面會補三個’/0’所以還是可以判斷是否相等的。真是迷之自信!這個問題其實最主要是考察你要知道內(nèi)存對齊,MyStruct的實際大小是8就夠了。然后未初始化的全局變量,static變量,編譯器會自動初始化為0。但是局部變量的值是不確定的,必須先賦值再使用。雖然全局變量,static變量可以不初始化,但是建議還是保持好習慣,所有的變量都要先初始化再使用!所以,這里char a后面3個字節(jié)不知道原本內(nèi)存中是什么數(shù)據(jù),那么A和B是沒法進行比較是否相等的!我們不妨gdb調(diào)試看看內(nèi)存中的情況:
MyStruct A;A.a = 'a';A.b = 10; 這里看到,在’a’后面3個字節(jié)分別是’/344’ ‘/377’ ‘/377’,后面補齊的內(nèi)容不確定,那么就造成了memcmp不能判斷是否相等。 用gdb查看內(nèi)存 格式:x /nfu 說明: x 是 examine 的縮寫 n 表示要顯示多少個內(nèi)存單元 f 表示內(nèi)存單元顯示方式,可取如下值: x 按十六進制格式顯示變量 d 按十進制格式顯示變量 u 按十進制格式顯示無符號整型 o 按八進制格式顯示變量 t 按二進制格式顯示變量 a 按十六進制格式顯示變量 i 指令地址格式 c 按字符格式顯示變量 f 按浮點數(shù)格式顯示變量 u表示一個內(nèi)存單元的長度 b 表示單字節(jié) h 表示雙字節(jié) w 表示四字節(jié) g 表示八字節(jié)
 這里看到,在’a’后面3個字節(jié)分別是’/344’ ‘/377’ ‘/377’,后面補齊的內(nèi)容不確定,那么就造成了memcmp不能判斷是否相等。 用gdb查看內(nèi)存 格式:x /nfu 說明: x 是 examine 的縮寫 n 表示要顯示多少個內(nèi)存單元 f 表示內(nèi)存單元顯示方式,可取如下值: x 按十六進制格式顯示變量 d 按十進制格式顯示變量 u 按十進制格式顯示無符號整型 o 按八進制格式顯示變量 t 按二進制格式顯示變量 a 按十六進制格式顯示變量 i 指令地址格式 c 按字符格式顯示變量 f 按浮點數(shù)格式顯示變量 u表示一個內(nèi)存單元的長度 b 表示單字節(jié) h 表示雙字節(jié) w 表示四字節(jié) g 表示八字節(jié)
新聞熱點
疑難解答