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

看板C_and_CPP作者 (阿轉)時間9年前 (2014/11/21 15:30), 9年前編輯推噓6(6019)
留言25則, 5人參與, 最新討論串1/1
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
我整理了程式碼,http://ideone.com/YEKS60
11/21 16:43, 1F

11/21 16:44, , 2F
可以直接在 ideone 執行,但是沒有解決你任何問題
11/21 16:44, 2F

11/21 16:45, , 3F
傳址看起來是正確的,K 後面多餘的刪除了。
11/21 16:45, 3F

11/21 16:46, , 4F
也許你需要提供一下 開發平台(Platform) 相關資訊?
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
我說的整理實際是把多餘的 code 註解掉啦 XD
11/21 16:55, 5F

11/21 16:56, , 6F
我用 VS 2013 測試,沒用過 Dev,請其它人幫忙看看吧
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
對了,我有對 scanf 做了修改,不知道有沒有影響
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
的確有可能是 Compiler 太舊的問題~
11/21 18:58, 9F
好的嗚嗚

11/22 00:15, , 10F
Orwell Dev-C++?
11/22 00:15, 10F
是的~ 我以後學習使用code block好了= = 11/22 09:18

11/22 09:31, , 11F
我仔細看了一下, 你在 Getcard 裡讀輸入的方法很危險
11/22 09:31, 11F

11/22 09:31, , 12F
temp 只有一個字元的大小, 你卻讀一個 %s 進去
11/22 09:31, 12F

11/22 09:32, , 13F
這代表一定有什麼東西被讀進來的"字串"的結尾'\0'給吃掉了
11/22 09:32, 13F

11/22 09:33, , 14F
你要不要改用 %c 或是把 temp 改宣告成字串試試看?
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
嗯, 這邊就是被那個'\0'蓋掉的就是你那個陣列
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
或者該說這種做法在 C 裡很普遍所以會有問題我也覺得很怪..
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
去抓mingw 用GNU最新的編譯器
11/22 16:18, 22F
好的 謝謝大大給我方向 我去研究一下 ※ 編輯: defsrisars (1.168.68.183), 11/22/2014 16:40:10

11/22 21:16, , 23F
dev很舊,但Orwell dev應該很新吧0.0
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
嗯嗯 加油XD
11/23 10:29, 25F
文章代碼(AID): #1KRkejTi (C_and_CPP)