精華區beta C_and_CPP 關於我們 聯絡資訊
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: 不了解位址算出來的結果是如何算的 希望得到的正確結果:解釋讓我懂 程式跑出來的錯誤結果:沒錯 開發平台: Dev-C++ 有問題的code: #include <cstdlib> #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; int main(int argc, char *argv[]) { struct employee { char id[7]; char name[20]; int salary; }; 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 <-----這是怎麼算出來的? 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 <-----這又是怎麼算出來的? system("PAUSE"); return EXIT_SUCCESS; } 補充說明:抱歉,初學者不懂指標的運作 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.19.219
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