簡體   English   中英

struct Node *ptr = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM