簡體   English   中英

在C中分配指向另一個結構的指針

[英]Mallocing a pointer to another struct in C

我想知道在這種情況下是否必須分配兩次內存。 例如:考慮我有結構:

struct ErrorCheck {
    int returnValue;
    struct Nodes * list;
};

struct Nodes {
    char * name;
    int grade;
    struct Nodes * next;
};

還有一個分配它們的函數:

void buildList() {
    struct ErrorCheck * newStruct;
    newStruct = malloc(sizeof(struct ErrorCheck));
    newStruct->list = malloc(sizeof(struct Nodes));

}

我是否必須如上所述兩次分配malloc? 或者,如果我想同時使用兩個結構,則第一個malloc是否足夠。

就像這樣: newStruct = malloc(sizeof(struct ErrorCheck)); 僅憑其本身就足夠了,是否存在任何情況都可能是對還是錯的情況?

這實際上取決於您要對list做什么。

  • 如果要讓list充當具有自己的內存的獨立變量,可以在其中進行讀寫操作,則需要第二個malloc()

  • 例如,如果您希望list占位符一樣工作 ,則為它分配一些其他已經分配的指針,然后使用它,在這種情況下,您不需要``malloc()。

malloc()設置sizeof(struct ErrorCheck) newStruct sizeof(struct ErrorCheck)並將指針存儲到newStruct ,可以為成員變量本身提供足夠的內存,即,它為intstruct node *成員變量分配內存。 指針指向的內存地址不確定。 您需要分別為指針變量分配內存,以使其指向有意義的地方。

那就是

  • 在使用返回的指針之前,應始終檢查malloc()是否成功。
  • 你需要調用free()做的每一個分配。

這里有幾件事。

您可能希望將指向ErrorCheck結構的指針保存在除本地變量之外的其他內容中,一旦buildList函數返回,該變量將消失。 您可以將其從函數返回給調用方,並將其存儲在更持久的位置(“ main”中的全局​​變量或局部變量)。 您不需要立即分配列表變量,但是將其初始化為NULL是一個好主意。 然后使用另一個函數通過分配“下一個”指針並設置其內容(名稱,等級和NULL)來添加節點。

稍后,您可以逐步瀏覽節點鏈以列出它們,或者在完成操作時一一釋放它們。 對於新的C編碼器,釋放列表可能有些棘手。 但這是另一個問題。

您需要兩個malloc。 malloc僅為結構的成員分配內存。 在您的示例中,第一個malloc為兩個8字節指針和一個整數分配內存。 Node結構不會自動分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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