當我運行以下程式時,它執行得很好:
int *a, i=3;
int **arr;
a = &i;
arr = malloc(sizeof(int*));
arr[0] = a;
但是, malloc 回傳一個 void* 指標,因此型別轉換它會更漂亮。我試過了,(int*)malloc(sizeof(int*))但我收到警告:
從不兼容的指標型別賦值
指向型別轉換的行(特別是等號)。具體情況的正確型別是什么?先感謝您!
uj5u.com熱心網友回復:
型別應該與您分配給的指標相同。由于您要分配給int **arr,因此您應該轉換為int **。
arr = (int **)malloc(sizeof(int*));
但是,一般不建議malloc()在 C 中轉換結果。請參閱我是否轉換了 malloc 的結果?原因。
uj5u.com熱心網友回復:
您應該使用int**,而不是int*因為型別arr是int**。
請注意,更好的分配模式是:
arr = malloc(sizeof *arr);
它對arr型別的變化很健壯。此外,它是緊湊的,避免了重復。它會自動檢測是否arr更改為陣列或非指標。分配的大小也會自動調整。
主要問題malloc不是回傳型別,而是確保分配正確的位元組數。
uj5u.com熱心網友回復:
通常,如果您正在分配該型別的物件,T則應將 malloc 呼叫的回傳指標強制轉換為該型別T *。
例如
T *p = ( T * )malloc( sizeof( T ) );
那就是你想獲得一個指向該型別物件的T指標,所以獲得的指標將具有該型別T *。
例如,如果物件具有型別,int *則相應的指標將具有型別int **。
在 C 中,指向 void 型別的指標可以分配給任何其他物件型別的指標,而無需進行強制轉換。有時,C 中的強制轉換用于自我記錄或避免某些型別的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360387.html
上一篇:僅對所有操作使用指標交換結構
