[問題] 關於C語言指標傳址的問題
C
問題(Question):
小的最近初學C語言
在寫程式時遇到了十分不理解的地方
希望有大大可以為小的指點迷津 謝謝
http://ideone.com/zAvKns
我覺得我在做和這個網頁的程式碼一樣的事
我希望我能在函式Y改變函式X傳入的struct內data的值
而這個程式碼顯示的結果也的確是傳入的task.t與task->t
記憶體位址相同&&值也成功的被改變了
http://ideone.com/Uul86Q
這是小的現在在寫的程式(未完成)
問題: 我在第265行的函式Display中宣告了Struct Player A
並在第331行將&A傳入函式Getcard (Getcard的接收型態為 Player *A)
但是問題來了
我這樣子的傳入1. 傳入後的 printf %p A->Case 與 傳入前的 printf %p &A.Case
記憶體位址不同 && 我在Getcard改變A->Case為1 但是在Display A.Case仍為0
想請問為什麼呢 ?
我以為我是在做和第一個網址的程式碼一樣的傳址法
但是當我實際在我想寫的程式裡使用時 傳入的址卻與原本的址不同&&無法直接對地址
裡的儲存值做改變(我希望在Getcard值的改變也會直接改變在Display的值)
http://tinyurl.com/lsb7yg6
此外還有一個小小的問題是我在程式碼第14-24行的宣告方式
(我要printf出牌組) 本來K後面是沒有" "的
我知道我的陣列宣告也只有13個(雖然現在compiler沒問題)
不知道為什麼
我的最後一張牌梅花K會printf不出來(printf出來K的地方會變成
我在很遠的地方的printf"Shuttle" 的Shuttle!)
感覺完全風馬牛不相關(剛剛測試不管有沒有多那個" " 都一樣)
(意思是原本printf應該是 梅花 K 卻變成 梅花 Shuttle!
請問為什麼會這樣呢?)
http://tinyurl.com/l449ogc
http://tinyurl.com/k354rxv
附圖說明~(只有最後一張梅花K會有圖1的結果 其他牌都正常)
謝謝大家~
初學者首po 如果有違反版規什麼的請告知...謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.168.68.183
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416555053.A.76C.html
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:33:18
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:44:41
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:49:39
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:50:23
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 15:51:17
→
11/21 16:43, , 1F
11/21 16:43, 1F
→
11/21 16:44, , 2F
11/21 16:44, 2F
→
11/21 16:45, , 3F
11/21 16:45, 3F
→
11/21 16:46, , 4F
11/21 16:46, 4F
謝謝您 !
請問一下是怎麼整理的呀
像我知道JAVA Eclipse 可以ctrl+F
抱歉其實我不知道開發平台是什麼
是作業系統或是IDE嗎?
是WIN7 Dev5.8.2
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 16:47:35
→
11/21 16:55, , 5F
11/21 16:55, 5F
→
11/21 16:56, , 6F
11/21 16:56, 6F
好的~謝謝大大
請問您用VS2013也會跟我一樣沒辦法做修改嗎?
像我在Getcard的 229.237.245行讓a->Case = 1;
然後return;
跳回330行
但是331行卻不會執行.(printf過問題如上方所述 Getcard中為1 函式結束回來仍是0)
(我確定test時有跳進三個if的其中之一,上方敘述都有做~就是存值存不進原本的a.Case)
此外繼續做下方電腦得牌(Player B)時
電腦的point也進不去(都是printf出0.0)
但是我前方Player A一樣的寫法
Point卻可以被做修改
為什麼會這樣啊QQ
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 16:59:45
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 17:01:13
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 17:04:54
推
11/21 17:17, , 7F
11/21 17:17, 7F
→
11/21 17:18, , 8F
11/21 17:18, 8F
我剛剛嘗試抓新的IDE (CODE BLOCK) 結果可以了=___=
這是IDE的問題的意思嗎QAQ
※ 編輯: defsrisars (1.168.68.183), 11/21/2014 17:32:12
→
11/21 18:58, , 9F
11/21 18:58, 9F
好的嗚嗚
推
11/22 00:15, , 10F
11/22 00:15, 10F
是的~
我以後學習使用code block好了= =
11/22 09:18
推
11/22 09:31, , 11F
11/22 09:31, 11F
→
11/22 09:31, , 12F
11/22 09:31, 12F
→
11/22 09:32, , 13F
11/22 09:32, 13F
→
11/22 09:33, , 14F
11/22 09:33, 14F
→
11/22 09:33, , 15F
11/22 09:33, 15F
謝謝大大~~
這個問題我後來也真的遇到了
不知道為什麼這個scanf的動作
會影響到我紀錄戰績的array
我de了很久才發現
我的array一開始都有被存進W或L
一到那個scanf &temp
我的array就會被清空變成NULL
後來我爬文改用getchar(因為改%c也是遇到回車鍵問題)
一開始一樣又遇到
getchar(temp)被跳過
再爬文改寫成
getchar(); //這個好像是用來接回車鍵的
getchar(temp);
才成功
感謝大大的提出~
另外請問我原題目問的傳址寫法會很危險嗎?
因為我覺得函式回傳很綁手綁腳
所以我都傾向傳指標進去直接做修改
話說有人知道第二個問題怎麼辦嗎QAQ
最後一張牌的bug我還是de不掉QAQ
※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:38:31
※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:40:29
※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:44:39
推
11/22 09:44, , 16F
11/22 09:44, 16F
是因為記憶體存放的關係嗎
為什麼temp的\0會蓋到陣列裡的值呀
※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:45:29
→
11/22 09:45, , 17F
11/22 09:45, 17F
→
11/22 09:46, , 18F
11/22 09:46, 18F
→
11/22 09:47, , 19F
11/22 09:47, 19F
→
11/22 09:47, , 20F
11/22 09:47, 20F
→
11/22 09:48, , 21F
11/22 09:48, 21F
好的~
謝謝您的回覆
因為我還很蔡逼八QAQ
所以都是想到什麼寫什麼
(像這個10點半應該有更簡潔有力的寫法)
然後很多寫的方式自己都不知道好不好或是正不正確、危不危險
有些地方也是爬文跟著寫其實自己也不太懂
像牌組的洗牌跟第二個問題的地方就不是我的想法
最怕的還是自己不知不覺用了很危險的寫法吧XD
那請問code block好嗎?
我只知道Dev很舊= =
※ 編輯: defsrisars (1.168.68.183), 11/22/2014 09:52:21
推
11/22 16:18, , 22F
11/22 16:18, 22F
好的
謝謝大大給我方向
我去研究一下
※ 編輯: defsrisars (1.168.68.183), 11/22/2014 16:40:10
推
11/22 21:16, , 23F
11/22 21:16, 23F
→
11/22 21:16, , 24F
11/22 21:16, 24F
我也是這樣想的
所以才都用新版的Orwell
(學校都還在4.9.2
我也都用隨身碟帶免安裝去寫
沒想到5.8.2了還是遇到問題1的問題
換code block也真的就好了
哭哭
※ 編輯: defsrisars (1.168.68.183), 11/23/2014 02:10:36
→
11/23 10:29, , 25F
11/23 10:29, 25F