memcpy 的一個常犯錯誤基本上也是熟到不能再熟的一個函式,今天在寫程式的時後,發現了一個使用觀念上的錯誤。參考下列程式:char buf[] 關鍵字廣告= {0x12, 0x34, 0x56, 0x78};int n;memcpy(&n,  buf,  sizeof(int));剛開始認為 n 的值應該是 0x12345678。但實際上大錯房地產特錯!! 此時 n 的值為 0x78563412!這是因為 Little-Endian和Big-Endian的記憶體擺放方式的問題。Big-Endian是低位址存放高位,而 房地產Little-Endian是高位置存放低位。也就是以1 個int n = 0x12345678來說。在Little-Endian的擺放方式為: 0x78563412,為右到左。在辦公室出租Big-Endian的擺放方式為: 0x12345678,為左到右。而一般pc為intel x86,剛好是是使用Little-Endian。故參考下面程式印出的順序:int n = 西服0x12345678;printf("n[0]=%d, n[1]=%d, n[2]=%d, 租屋n[3]=%d\r\n"          , n & 0x000000ff,  (n >> 8) 宜蘭民宿& 0x0000ff,  (n >> 16) & 0x00ff,  n >> 24);所以以後故使用memcpy的時後,當是從一個byte的型別copy到信用卡代償大於一個byte的型別(例如int)。此時並需要用如 htonl這函式來轉換順序;上面程式加上這一行就可變成0x12345678: char buf[] = {0x12, 酒店兼職0x34, 0x56, 0x78}; int n; memcpy(&n,  buf,  sizeof(int));n = htonl(n);此時n = 值為 0x12345678!!
租屋

.msgcontent .wsharing ul li { text-indent: 0; }



分享

Facebook
Plurk
YAHOO!

iu37iunjpn 發表在 痞客邦 留言(0) 人氣()