![](/img/trans.png)
[英]Difference between malloc(sizeof(ptr)) and malloc(sizeof(ptr*))?
[英]How does struct Node *ptr = malloc(sizeof(*ptr)) work?
我是 C 初學者,在嘗試實現鏈表時遇到了這段代碼。
struct Node *ptr = malloc(sizeof(*ptr));
節點結構如下所示:
struct Node {
int data;
struct Node *next;
};
我試圖理解第一行。 似乎malloc(sizeof(*ptr))
已經知道ptr
的內容。 左邊到底發生了什么,它是在調用 malloc 之前發生的嗎?
如果您想知道某個類型的大小,則僅使用帶有sizeof
括號。 如果你有一個表達式,比如*ptr
,那么寫就足夠了:
struct Node *ptr = malloc(sizeof *ptr); // <- no paranthesis
表達式*ptr
取消引用指針,因此它成為一個struct Node
,這就是sizeof
返回的大小。
sizeof
expression
- 返回表達式類型的對象表示的大小(以字節為單位)。 沒有對表達式應用隱式轉換。
如果你這樣做,它與你得到的大小相同:
struct Node *ptr = malloc(sizeof(struct Node)); // <- paranthesis needed
但為了清楚起見,第一種選擇通常更可取。
似乎
malloc(sizeof(*ptr))
已經知道ptr
的內容。
實際上,它沒有。 sizeof
運算符實際上並不評估它的操作數(除非它是一個可變長度數組),它只是查看它的類型。 這意味着ptr
實際上並未解除引用,因此是安全操作。
您需要為聲明為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
的操作數的sizeof
,以確定該類型對象的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.