→ johnhmj:啊~我的眼睛~>_<||| 01/09 12:03
推 stockton19:我印象中struct的mem不一定會"緊密" emun才會 @@? 01/09 12:12
→ johnhmj:在於資料成員的資料型態不一致~ 01/09 12:15
→ blacksway:1F眼睛@@? 01/09 12:39
推 hilorrk:alignment 01/09 12:55
> -------------------------------------------------------------------------- <
作者: dendrobium (石斛蘭) 看板: C_and_CPP
標題: Re: [問題] 位址的疑問
時間: Sat Jan 9 13:20:19 2010
※ 引述《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