我是 C 初學者,在嘗試實作鏈表時遇到了這段代碼。
struct Node *ptr = malloc(sizeof(*ptr));
節點結構如下所示:
struct Node {
int data;
struct Node *next;
};
我試圖理解第一行。好像malloc(sizeof(*ptr))已經知道ptr. 左邊到底發生了什么,它是在呼叫 malloc 之前發生的嗎?
uj5u.com熱心網友回復:
好像
malloc(sizeof(*ptr))已經知道ptr.
實際上,它沒有。該sizeof運營商實際上并沒有評估其運算元(除非它是一個可變長度陣列),它只是著眼于它的型別。這意味著ptr實際上并未取消參考,因此是安全操作。
uj5u.com熱心網友回復:
僅sizeof當您想知道某種型別的大小時才使用括號。如果你有一個運算式,比如*ptr,那么寫就足夠了:
struct Node *ptr = malloc(sizeof *ptr); // <- no parenthesis
運算式*ptr取消參考指標,因此它變成了 a struct Node,這sizeof就是回傳大小的原因。
sizeofexpression- 回傳運算式型別的物件表示的大小(以位元組為單位)。沒有對運算式應用隱式轉換。
如果你這樣做,它與你得到的大小相同:
struct Node *ptr = malloc(sizeof(struct Node)); // <- parenthesis needed
但為了清楚起見,第一種選擇通常更可取。
uj5u.com熱心網友回復:
您需要為struct Node宣告的型別的物件分配記憶體
struct Node {
int data;
struct Node *next;
};
所以在呼叫 malloc 時需要指定為該型別的物件分配的記憶體大小。函式 malloc 回傳一個指向已分配記憶體的指標。
所以你可以寫
struct Node *ptr = malloc( sizeof( struct Node ) );
另一方面,運算式*ptr的型別為 struct Node。也就是說,宣告的指標ptr具有指標型別struct Node *,取消參考這樣的指標會*ptr產生型別的運算式struct Node。
所以你也可以重寫上面的記錄
struct Node *ptr = malloc(sizeof(*ptr));
因為在這種情況下sizeof( struct Node )相當于sizeof( *ptr ).
也就是說,編譯器需要知道運算子的運算元的型別sizeof,以確定該型別物件的大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/357615.html
上一篇:使用鏈接的哈希表有問題
