[問題] (int*)malloc(size(int))

看板C_and_CPP作者 (哈哈)時間9年前 (2015/04/27 17:46), 編輯推噓3(3023)
留言26則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) C 問題(Question): 小弟有個笨問題困擾小弟許久 上網跟看書都不解 特請教版上前輩 我看到一行程式 int *ptr = (int*)malloc(sizeof(int)); 我的疑惑是 我知道啟動指標可以 int a; int *ptr = &a; 而 malloc(sizeof(int)) 本身的意思就是從heap中配置一int記憶體,並回傳 此記憶體address,因此,根據上面啟動指標,應該寫成 int *ptr = malloc(sizeof(int)) ? 為啥我看到的還多了(int*)? 謝謝大家! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 163.25.115.102 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1430127985.A.4B8.html

04/27 17:52, , 1F
轉型 (void*) -> (int*)
04/27 17:52, 1F

04/27 17:54, , 2F
抱歉樓上大大 我很嫩 能說詳細一點嗎 thx
04/27 17:54, 2F

04/27 17:56, , 3F
void* malloc (size_t size);
04/27 17:56, 3F

04/27 17:57, , 4F
sorry 我真笨我還是不懂 >
04/27 17:57, 4F

04/27 17:58, , 5F
是說為啥要加個void*在前面呢?
04/27 17:58, 5F

04/27 17:58, , 6F
另外 一定要加(int*)嗎?
04/27 17:58, 6F

04/27 18:02, , 7F
C不用 C++要
04/27 18:02, 7F

04/27 18:06, , 8F
malloc 只傳回通用指標,必須自行強制轉型成 int*
04/27 18:06, 8F

04/27 18:07, , 9F
通用指標?原來還有這個東西?好奇這個跟其他指標不同在?
04/27 18:07, 9F

04/27 18:08, , 10F
為什麼C++一定要呢?這有甚麼原理可循嗎?
04/27 18:08, 10F

04/27 18:20, , 11F
通用指標就是void * 現在先背起來 等你長大就懂了
04/27 18:20, 11F

04/27 19:25, , 12F
語言本身就是這樣設計的啊~
04/27 19:25, 12F

04/27 19:25, , 13F
長大就懂了是啥XD
04/27 19:25, 13F

04/27 19:40, , 14F
與其說通用,不如說"不明"
04/27 19:40, 14F

04/27 19:41, , 15F
因為要把指向不知是什麼的指標轉成指向int
04/27 19:41, 15F

04/27 19:41, , 16F
所以編譯器要求用強制轉型來確認你知道你在做什麼
04/27 19:41, 16F

04/27 20:17, , 17F
謝謝樓上前輩們的解說 我很擔心我問題太多太煩人了:p
04/27 20:17, 17F

04/27 21:38, , 18F
有的問題真的是學到後面才會懂 在那之前怎麼解釋也很難
04/27 21:38, 18F

04/27 21:39, , 19F
講清楚 而且往往聽過就忘 因為配合的知識還沒學到
04/27 21:39, 19F

04/27 21:46, , 20F
所以先記得malloc()的結果一定要轉型才能安全使用
04/27 21:46, 20F

04/27 21:49, , 21F
這樣就好了 其他東東太複雜或太tricky以後再學
04/27 21:49, 21F

04/28 00:51, , 22F
謝謝大家不厭其煩的解說 謝謝!!
04/28 00:51, 22F

05/01 12:05, , 23F
補充:通用指標不能直接dereference,故需要強制轉型
05/01 12:05, 23F

05/07 22:21, , 24F
因為malloc很笨,只會回傳void*類型,要聰明的我們自己
05/07 22:21, 24F

05/07 22:21, , 25F
轉成我們要的類型,否則與我們自己宣告的指標變數類型
05/07 22:21, 25F

05/07 22:21, , 26F
不匹配
05/07 22:21, 26F
文章代碼(AID): #1LFWLnIu (C_and_CPP)