Re: [問題] 位址的疑問

看板C_and_CPP作者 (石斛蘭)時間16年前 (2010/01/09 13:20), 編輯推噓5(500)
留言5則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《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)

01/09 14:13, , 1F
好觀念 謝謝
01/09 14:13, 1F

01/09 14:19, , 2F
好用心!
01/09 14:19, 2F

01/09 14:45, , 3F
感謝您!!!
01/09 14:45, 3F

01/09 20:16, , 4F
真有心的回文@@ 推!!!
01/09 20:16, 4F

01/09 20:45, , 5F
推!要不要收精華區呀板主大人
01/09 20:45, 5F
文章代碼(AID): #1BI18MSi (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BI18MSi (C_and_CPP)