[問題] 有無malloc?

看板C_and_CPP作者 (把握當下)時間14年前 (2011/11/10 11:05), 編輯推噓9(9051)
留言60則, 10人參與, 最新討論串1/2 (看更多)
問題(Question): 如題,此程式的目的是將Short型態變數c傳入給整數指標變數A,小弟原本的寫法 是第19行 不過執行以後發生錯誤 invalid conversion from `int*' to `int' 改成17 18行寫法編譯就OK 小弟不了解為什麼需要malloc 若沒有malloc就無法 強制轉型 還煩請各位大大解答 謝謝... 程式碼(Code): http://pastie.org/2839768 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.21.79.38

11/10 11:13, , 1F
A是一個pointer, *A是此pointer指到的位址中的值
11/10 11:13, 1F

11/10 11:14, , 2F
所以A是int*, *A是int 19行寫法是錯的, 無觀malloc
11/10 11:14, 2F

11/10 11:17, , 3F
11/10 11:17, 3F

11/10 11:18, , 4F
不過像這樣把內存小的cast到大的 可能會讀到一些外部的
11/10 11:18, 4F

11/10 11:19, , 5F
位址
11/10 11:19, 5F

11/10 11:24, , 6F
有先強制轉型了,應該就ok了
11/10 11:24, 6F

11/10 11:27, , 7F
未必哦 假設short是2bytes, int是4bytes 然後不malloc
11/10 11:27, 7F

11/10 11:28, , 8F
而直接寫成A = (int *)&c; 那printf那行就會讀到一些
11/10 11:28, 8F

11/10 11:28, , 9F
原po可以參考第三戒,指標沒有先指定是不能用
11/10 11:28, 9F

11/10 11:28, , 10F
未定義的記憶體位址 (4-2=2bytes)
11/10 11:28, 10F

11/10 11:28, , 11F
而且給予*a的就數值就好,你又給他指標會錯誤
11/10 11:28, 11F

11/10 11:29, , 12F
轉型成int不會把多的兩個補齊嗎?
11/10 11:29, 12F

11/10 11:29, , 13F
我記得小轉大不是都安全的嗎?
11/10 11:29, 13F

11/10 11:32, , 14F
那是值 指向不同大小的指標那是一回事
11/10 11:32, 14F

11/10 11:33, , 15F
另一回事
11/10 11:33, 15F

11/10 11:35, , 16F
打個比方就是我只給(malloc)你兩格 你卻撈過界拿四格
11/10 11:35, 16F

11/10 11:43, , 17F
但是他code不是直接指向short的位址,而是先宣告一
11/10 11:43, 17F

11/10 11:44, , 18F
個空的int空間給ptr,然後再把short的值轉成int給予
11/10 11:44, 18F

11/10 11:44, , 19F
*ptr,這樣也是會出錯?
11/10 11:44, 19F

11/10 11:44, , 20F
malloc用完要記得free掉
11/10 11:44, 20F

11/10 11:47, , 21F
借問 free() 和 delete() 差在哪裡???
11/10 11:47, 21F

11/10 11:48, , 22F
@diabloevagto:還是有問題,malloc出來是 4bytes, short
11/10 11:48, 22F

11/10 11:48, , 23F
11/10 11:48, 23F

11/10 11:48, , 24F
只有2bytes,強制cast過去,另外要塞的2bytes哪來?
11/10 11:48, 24F

11/10 11:50, , 25F
難道不會自動補齊?
11/10 11:50, 25F

11/10 11:51, , 26F
不會,會將原本的 short 後面2bytes問號抓過去.
11/10 11:51, 26F

11/10 11:51, , 27F
那個叫什麼術語的有點忘記了,就是看最左邊的bit決定
11/10 11:51, 27F

11/10 11:51, , 28F
補齊的bit要寫0或1
11/10 11:51, 28F

11/10 11:52, , 29F
原來不會...抱歉我一直誤會了= =
11/10 11:52, 29F

11/10 11:52, , 30F
所以要這樣做之前,要先把*ptr寫成0會比較安全嗎?
11/10 11:52, 30F

11/10 11:56, , 31F
Orz..sorry,是我搞錯了,malloc出來後會轉沒錯,不malloc
11/10 11:56, 31F

11/10 11:56, , 32F
抓到的才有問題,再次感到抱歉..
11/10 11:56, 32F

11/10 11:57, , 33F
就說那個動作是值才有的 指標不會有那種動作
11/10 11:57, 33F

11/10 11:58, , 34F
這裡的情形也類似 我給你的兩格是參數 c 的位置的兩格
11/10 11:58, 34F

11/10 11:58, , 35F
但你卻撈過界用 int * 指過去抓了四格...
11/10 11:58, 35F

11/10 11:59, , 36F
在你這份 code 裡和 malloc 就沒什麼關係了
11/10 11:59, 36F

11/10 12:01, , 37F
感謝 LPH66 大指正 (一開始對,想到後來整個都亂了 XD)
11/10 12:01, 37F

11/10 12:03, , 38F
我覺得對話有點分歧 XDD
11/10 12:03, 38F

11/10 12:06, , 39F
可能是我的問題..我當初推時沒看連結看上面你說malloc就跟了
11/10 12:06, 39F

11/10 12:06, , 40F
看了連結才發現和 malloc 沒關係...XD
11/10 12:06, 40F

11/10 12:31, , 41F
補一下 http://codepad.org/LaaG3KDg 確實不會補0 。
11/10 12:31, 41F

11/10 13:20, , 42F
謝謝各位大大的解釋 小弟瞭解了
11/10 13:20, 42F
那小弟想在請問一下各位大大如果我把malloc那行給去除掉的話 只留下 *A =(int) c; 小弟的想法是有可能A所存的位址會指到其他的位址 然後改變到其他 變數的值 這樣的想法是否有問題呢??還請各位大大指導 謝謝 ※ 編輯: thank1984 來自: 211.21.79.38 (11/10 13:26)

11/10 13:33, , 43F
這個說法..它可能會改變在sub_func相關變數,但回到
11/10 13:33, 43F

11/10 13:34, , 44F
main 裡面去又不見,因不是 pass by pointer
11/10 13:34, 44F

11/10 13:48, , 45F
結論就是說,原po指標有先new的話轉型過去式ok,但如
11/10 13:48, 45F

11/10 13:48, , 46F
果直接指向short因為型態不同,取出來的數值會錯誤
11/10 13:48, 46F

11/10 13:49, , 47F
請問這樣下結論是對的嗎?
11/10 13:49, 47F

11/10 14:02, , 48F
Orz.. 為了表達我的歉意,我找時間回文說明好了,另,
11/10 14:02, 48F

11/10 14:03, , 49F
dia~ 所下結論不正確。
11/10 14:03, 49F

11/10 14:03, , 50F
抱歉了,每次問題都好多Orz
11/10 14:03, 50F

11/10 14:09, , 51F
樓上正常,所以我現在幾乎都看文章不回文了.避免獻醜
11/10 14:09, 51F

11/10 14:26, , 52F
C/C++真是怪物...
11/10 14:26, 52F

11/10 14:33, , 53F
c++是stan.非怪物.而且c++還在長大
11/10 14:33, 53F

11/10 15:17, , 54F
瞭解了 小弟指標觀念真的要加強= = 感謝各位大大的解答
11/10 15:17, 54F

11/10 15:20, , 55F
來等t大的詳解...
11/10 15:20, 55F

11/10 15:20, , 56F
a大說的stan是standard?
11/10 15:20, 56F

11/10 15:22, , 57F
Satan<--
11/10 15:22, 57F

11/10 15:22, , 58F
原來是比怪物還要怪物的怪物 (好難唸)
11/10 15:22, 58F

11/10 15:23, , 59F
太可怕了(抖)
11/10 15:23, 59F

11/10 22:04, , 60F
太可怕了QwQ
11/10 22:04, 60F
文章代碼(AID): #1Ekp-6uV (C_and_CPP)
文章代碼(AID): #1Ekp-6uV (C_and_CPP)