[問題] 關於C語言指標傳址的問題

作者: defsrisars (阿轉)   2014-11-21 15:30:50
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 如果有違反版規什麼的請告知...謝謝
作者: allyusd (夢幻賤狗)   2014-11-21 16:43:00
我整理了程式碼,http://ideone.com/YEKS60可以直接在 ideone 執行,但是沒有解決你任何問題傳址看起來是正確的,K 後面多餘的刪除了。也許你需要提供一下 開發平台(Platform) 相關資訊?我說的整理實際是把多餘的 code 註解掉啦 XD我用 VS 2013 測試,沒用過 Dev,請其它人幫忙看看吧沒有耶,我測試的結果一切正常,所以沒辦法幫你對了,我有對 scanf 做了修改,不知道有沒有影響
作者: carylorrk (carylorrk)   2014-11-21 18:58:00
的確有可能是 Compiler 太舊的問題~
作者: KoenigseggG (地表最速)   2014-11-22 00:15:00
Orwell Dev-C++?
作者: LPH66 (-6.2598534e+18f)   2014-11-22 09:31:00
我仔細看了一下, 你在 Getcard 裡讀輸入的方法很危險temp 只有一個字元的大小, 你卻讀一個 %s 進去這代表一定有什麼東西被讀進來的"字串"的結尾'\0'給吃掉了你要不要改用 %c 或是把 temp 改宣告成字串試試看?(雖然這跟你原來的問題似乎無關就是了)嗯, 這邊就是被那個'\0'蓋掉的就是你那個陣列至於傳址的部份我稍微看了一下應該是沒什麼問題或者該說這種做法在 C 裡很普遍所以會有問題我也覺得很怪..>修文問題 確實是編譯器對變數存放位置的關係除非你深入追下去不然不會知道編譯器怎麼排的所以最正確的做法就是不要超界
作者: n91324 (不丹)   2014-11-22 16:18:00
去抓mingw 用GNU最新的編譯器
作者: KoenigseggG (地表最速)   2014-11-22 21:16:00
dev很舊,但Orwell dev應該很新吧0.0前幾天才出最新版而已嗯嗯 加油XD

Links booklink

Contact Us: admin [ a t ] ucptt.com