看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《blacksway ()》之銘言: : struct employee : { : char id[7]; : char name[20]; : int salary; : }; 可以 google "Data structure alignment" 簡單的來說就是 struct 資料結構會向一個 word 的大小倍數對齊 以 struct employee 來講,它原本該長這個樣子(假設 int 佔 4 byte) 0 1 2 3 0 1 2 3 +--------+--------+--------+--------+--------+--------+--------+--------+ | id[0] | id[1] | id[2] | id[3] | id[4] | id[5] | id[6] |name[0] | +--------+--------+--------+--------+--------+--------+--------+--------+ |name[1] |name[2] |name[3] |name[4] |name[5] |name[6] |name[7] |name[8] | +--------+--------+--------+--------+--------+--------+--------+--------+ |name[9] |name[10]|name[11]|name[12]|name[13]|name[14]|name[15]|name[16]| +--------+--------+--------+--------+--------+--------+--------+--------+ |name[17]|name[18]|name[19]| salary | +--------+--------+--------+--------+--------+--------+--------+ 但是 Data structure alignment 的關係 因為 salary 的位置不在 4 的倍數位置 所以會調整成 0 1 2 3 0 1 2 3 +--------+--------+--------+--------+--------+--------+--------+--------+ | id[0] | id[1] | id[2] | id[3] | id[4] | id[5] | id[6] |name[0] | +--------+--------+--------+--------+--------+--------+--------+--------+ |name[1] |name[2] |name[3] |name[4] |name[5] |name[6] |name[7] |name[8] | +--------+--------+--------+--------+--------+--------+--------+--------+ |name[9] |name[10]|name[11]|name[12]|name[13]|name[14]|name[15]|name[16]| +--------+--------+--------+--------+--------+--------+--------+--------+ |name[17]|name[18]|name[19]| 空著 | salary | +--------+--------+--------+--------+--------+--------+--------+--------+ 接下來再來看你的code : struct employee manager = {"D12345","Peter",3500}; : printf("&manager=%x\n",&manager); : //位址為22ff50 : printf("&manager.id=%x\n",&manager.id); : //位址為22ff50 : printf("&manager.name=%x\n",&manager.name); : //位址為22ff57 : printf("&manager.salary=%x\n\n",&manager.salary); : //位址為22ff6c <-----這是怎麼算出來的? name 空著 22ff57 + 0x14 + 0x01 = 22ff6c : printf("manager.id=%s\n",manager.id); : printf("manager.name=%s\n",manager.name); : printf("manager.salary=%d\n\n",manager.salary); : printf("&manager+1=%x\n",&manager+1); : //位址為22ff70 <-----這又是怎麼算出來的? 對齊過後 sizeof(struct employee) 是 32 而非原本的 31 而且這邊的 +1 是代表 "加一個 sizeof(struct employee)" ( 因為 manager 是 struct employee ) 所以 22ff50 + 0x20 = 22ff70 ^ \ 十進位的 32 換成 16進位是 20 之所以會有這種對齊的機制是為了加快計算位置的關係 有錯煩請指正,謝謝 :) -- 人家可不是為了你才這樣做的哦! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.198.35.85 ※ 編輯: dendrobium 來自: 60.198.35.85 (01/09 14:09)
stockton19:好觀念 謝謝 01/09 14:13
andyisman:好用心! 01/09 14:19
blacksway:感謝您!!! 01/09 14:45
cjoe:真有心的回文@@ 推!!! 01/09 20:16
hilorrk:推!要不要收精華區呀板主大人 01/09 20:45