作者a127a127 (TDYa127)
看板C_and_CPP
標題Re: [問題] struct的疑問
時間Sat May 23 18:50:33 2009
※ 引述《kuopin (Kuopin)》之銘言:
: #include<stdio.h>
: int main(void){
: typedef struct{
: int hour,minutes;
: double second;
: } time;
: typedef struct{
: int year,month,day;
: time hour,minutes,second;
: } date;
: date now = {2004,4,7,{12,50,29.51}};
: printf("now=%.2d/%.2d/%.2d %.2d:%.2d:%.2f\n",now.month,now.day,now.year,now.hour,now.minutes,now.second);
: printf("sizeof(now)=%d\n",sizeof(date));
: }
: 以上是我們老師要我們練習結構的練習題
: 我已經解出來...不過老師有要求我們用sizeof去抓now的大小...
: 我抓出來的結果是64...可是老師給的答案是32....
: 不知道哪裡出了問題? 能否請版友幫我看一下+"
: 對巢狀結構不太了解....
你和老師都對,因為你寫的不是老師要的。(老師要的那種才是邏輯上比較正確的)
typedef struct{
int hour,minutes;
double second;
} time;
time是一個struct,裡面有hour(
int)、minutes(
int)、second(
double)。
用起來像下面這樣:
time x;
x.hour = 1;
x.minutes = 2;
x.second = 3.0;
typedef struct{
int year,month,day;
time hour,minutes,second;
} date;
date是一個struct,裡面有
year(
int)、month(
int)、day(
int)、hour(
time)、minutes(
time)、second(
time)。
hour、minutes、second都是
time型態的變數,
所以裡面分別也有自己的hour、minutes、second。
date x;
x 是一個
date
x.hour 是一個
time
x.hour.hour 才是一個
int
而你的答案會對,只是剛好而已,(詳細的情形,以後學到可變長度的參數就知道了。)
實際上,printf根本沒有印到now.minutes,now.second。
你的時間全部都是存在now.hour
(因為剛剛講的,這是一個
time,裡面還有自己的hour、minutes、second。)
(其實你的編譯器可能有給你兩個warning,
說初始化列少了date::minutes和date::second。)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.31.130.98
推 VictorTom:兩個都對??就算是int為16 bits的環境, 就算是不考慮 05/23 22:19
→ VictorTom:compiler做alignment, 再怎麼辦sizeof(data)都不會算 05/23 22:19
→ VictorTom:32這個答案出來吧....?_? 05/23 22:19
→ a127a127:不,樓上沒看懂我的意思。time只需要一個,他卻用了3個。 05/23 23:21
→ a127a127:所以導致了對於這種要求下,他多使用了32bytes。 05/23 23:22
推 VictorTom:我大概懂您的意思了, 他的struct放了比較多無謂的 05/23 23:35
→ VictorTom:element了, 所以他的sizeof會比老師的大得多很多.... 05/23 23:35
→ VictorTom:不過老師說的也只是"某一種組合"的答案罷了..... 05/23 23:36
→ a127a127:嗯,所以才會說「邏輯上」。不過他本身使用上就有問題了 05/23 23:37
→ VictorTom:個人是不覺得sizeof應該有什麼標準答案就是了:) 05/23 23:37
→ VictorTom:的確他的寫法是怪怪的, 本來還以為這是老師刻意出的XD 05/23 23:38