全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1216
推到 Plurk!
推到 Facebook!

指標的用法

答題得分者是:collonil
fullgui
一般會員


發表:22
回覆:28
積分:10
註冊:2003-04-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-24 14:47:32 IP:140.96.xxx.xxx 未訂閱
各位大大: 我寫了一個程式如下:    #include  #include typedef struct b{ int bb; }b; typedef struct a{ int aa; b *next; }a; b* testfun(b* p) { printf("%d",p->bb); return(p); } void main(void) { a *test; b *next1; test = (a *)malloc( sizeof(a) ); test->next = (b *)malloc( sizeof(b) ); test->aa=1023; test->next->bb=1033; next1=(b*)malloc(sizeof(b)); next1->bb=1; testfun( (b*)test ); /// 發生問題 testfun( next1); } //////////////////////////////// 我發現在發生問題的那一行 做強制轉型會失敗 也就是我想列印出的值為1033 可是實際上卻是1023! 為什麼會這樣呢? 謝謝大家。
collonil
中階會員


發表:13
回覆:56
積分:63
註冊:2003-03-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-24 14:57:20 IP:210.71.xxx.xxx 未訂閱
您好... 請試試看把 testfun( (b*)test ); /// 發生問題 改成 testfun(test->next);    -- BCB學習中~~
fullgui
一般會員


發表:22
回覆:28
積分:10
註冊:2003-04-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-24 15:02:59 IP:140.96.xxx.xxx 未訂閱
謝謝你的回答 不過因為某些原因, 我必須要使用強制轉型的方法。 只是我不知道正確寫法為何? 再一次謝謝大家^^
collonil
中階會員


發表:13
回覆:56
積分:63
註冊:2003-03-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-24 15:10:29 IP:210.71.xxx.xxx 未訂閱
可是aa這個struct中並沒有bb這個變數啊, 所以1033並不存在於test所配置的記憶體中... 那test再怎麼轉型應該都不會出現1033...    如果我觀念有錯請指正.....    -- BCB學習中~~ 發表人 -
fullgui
一般會員


發表:22
回覆:28
積分:10
註冊:2003-04-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-24 15:22:00 IP:140.96.xxx.xxx 未訂閱
不好意思,我是要把a struct 轉型成b struct,然後藉此來存取bb。謝謝。
collonil
中階會員


發表:13
回覆:56
積分:63
註冊:2003-03-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-24 15:31:00 IP:210.71.xxx.xxx 未訂閱
引言: 不好意思,我是要把a struct 轉型成b struct,然後藉此來存取bb。謝謝。
a struct(test)在記憶體中的資料類似這樣 {1023, b struct的位置} b struct在記憶體中的資料類似這樣 {1033} 不管如何轉型, test都會指向a struct的位置, 而不會指向b struct 當然也就讀不到1033... 除非重新設定test讓它指向b struct Ex. test = (a*)test->next; 但這樣就失去了指向a struct的指標了.. -- BCB學習中~~ 發表人 -
fullgui
一般會員


發表:22
回覆:28
積分:10
註冊:2003-04-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-24 15:43:56 IP:140.96.xxx.xxx 未訂閱
謝謝你 不過我是想把a和b 這兩個struct來寫成像繼承的關係 不知道我寫的程式還有沒有方法補救,謝謝大家。
collonil
中階會員


發表:13
回覆:56
積分:63
註冊:2003-03-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-24 15:56:16 IP:210.71.xxx.xxx 未訂閱
引言: 謝謝你 不過我是想把a和b 這兩個struct來寫成像繼承的關係 不知道我寫的程式還有沒有方法補救,謝謝大家。
繼承要用class來寫, 不過我不覺得這能解決您的問題... 即使a class繼承了b class, 在這兩個class生成時, 它們還是兩個不同的物件, 各自佔有記憶體, 所以... 跟使用struct時的問題是相同的... -- BCB學習中~~ 發表人 -
fullgui
一般會員


發表:22
回覆:28
積分:10
註冊:2003-04-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-24 17:22:05 IP:140.96.xxx.xxx 未訂閱
謝謝你的回答,而且好像強制型別轉換並不會做指標位置的轉換。
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-24 17:42:12 IP:61.230.xxx.xxx 未訂閱
你好:     a structure的第一個儲存資料為1023,第二個資料是一個指標指向存放b  structure的資料,當你將test強制轉型為b資料型態的p時,p資料直接對映 到test的資料如下 p->bb = test->aa; NULL  = test->next; 強制轉型是將記憶體位置直接對映,所以p->bb就對映test的第一筆資料1023 你不改成collonil的方法,p->bb永遠不會是1033。如果要硬拗,請服用下面的 方法
b* testfun(b* p)
{ 
  printf("%d",((b*)(((a*)p)->next))->bb);
  return(p);
}
有點多此一舉 或是a structure 改成
typedef struct a
{
 b  *next;  //上下交換
 int aa;
}a;    b* testfun(b* p)
{ 
  printf("%d",((b*)(p->bb))->bb);
  return(p);
}
參考看看囉.只能用這樣改,我沒有法術,不能直接叫電腦改成你想的那樣 電腦其實是很笨滴
fullgui
一般會員


發表:22
回覆:28
積分:10
註冊:2003-04-01

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-25 10:18:53 IP:140.96.xxx.xxx 未訂閱
謝謝JerryKuo 和collonil的熱心幫忙, 不過得分者只能有一位, 所以我給collonil 希望JerryKuo 不要介意喔^^ 謝謝!!
系統時間:2024-05-18 4:04:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!