我有一本書是這樣說的:
malloc() 分配仍然有一個小問題。我們仍然要解釋溫度 malloc() 的左邊部分。(int *) 是干什么用的?
(int *) 是一種型別轉換。你已經在本書中看到了其他型別的型別轉換。要將 float >value 轉換為 int,請將 (int) 放在浮點值之前,如下所示:
aVal = (int)salary;型別轉換中的 * 表示該型別轉換是指標型別轉換。 malloc() 總是回傳一個字符指標。如果要使用 malloc() 分配整數、浮點數或除 char 以外的任何型別的資料,則必須對 malloc() 進行型別轉換,以便接收分配的指標變數(例如 temps)接收正確的指標資料型別。temps 是一個整數指標;除非將 malloc() 型別轉換為整數指標,否則不應將 temps 分配給 malloc() 的分配記憶體。因此,前面 malloc() 的左側只是告訴 malloc() 一個整數指標,而不是默認字符指標,將指向第一個分配的值。
臨時工:
int * temps; /* Will point to the first heap value */
temps = (int *) malloc(10 * sizeof(int)); /* Yikes! */
在閱讀了類似的執行緒之后,據說malloc()回傳的是 void 型別的指標,而不是字符型別的指標。我錯過了什么嗎?我知道不需要malloc()在 C 中進行型別轉換。
uj5u.com熱心網友回復:
在 1989 標準之前,C 沒有“通用”指標型別;指標型別不兼容,因此要將char *值分配給int *變數(反之亦然),您需要將值顯式轉換為目標型別。
同樣在 1989 年標準之前,所有記憶體分配函式 ( malloc/calloc/realloc) 都回傳char *,因此如果將結果分配給不同的指標型別,則必須使用強制轉換:
int *ptr = (int *) malloc( some_size );
坦率地說,這是一件讓人頭疼的事情。人們認識到 C 可以使用某種“通用”指標型別,因此void *引入了該型別,以及void *可以將值轉換為其他指標型別(反之亦然)而無需強制轉換的規則。記憶體分配函式已更改為 return void *,因此不再需要強制轉換:
int *ptr = malloc( some_size );
您不能取消參考 a void *- 結果將是一個void沒有值和大小的型別。出于同樣的原因,您不能在 a 上進行指標運算或使用下標運算子void *。
uj5u.com熱心網友回復:
正如評論中提到的 user207421,您的書很可能已經很舊了。最初,C 沒有通用指標型別(即void*)。我忘記了這是什么時候添加的。當時最接近的事情是char*因為每個指標,無論其型別如何,都可以安全地轉換為char*(某種)。
uj5u.com熱心網友回復:
malloc()總是回傳一個字符指標嗎?
否。由于 C89,malloc()回傳一個void *.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464894.html
上一篇:在類中正確使用參考
