[英]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
,可以為成員變量本身提供足夠的內存,即,它為int
和struct node *
成員變量分配內存。 指針指向的內存地址不確定。 您需要分別為指針變量分配內存,以使其指向有意義的地方。
那就是
malloc()
是否成功。 free()
為你做的每一個分配。 這里有幾件事。
您可能希望將指向ErrorCheck結構的指針保存在除本地變量之外的其他內容中,一旦buildList函數返回,該變量將消失。 您可以將其從函數返回給調用方,並將其存儲在更持久的位置(“ main”中的全局變量或局部變量)。 您不需要立即分配列表變量,但是將其初始化為NULL是一個好主意。 然后使用另一個函數通過分配“下一個”指針並設置其內容(名稱,等級和NULL)來添加節點。
稍后,您可以逐步瀏覽節點鏈以列出它們,或者在完成操作時一一釋放它們。 對於新的C編碼器,釋放列表可能有些棘手。 但這是另一個問題。
您需要兩個malloc。 malloc僅為結構的成員分配內存。 在您的示例中,第一個malloc為兩個8字節指針和一個整數分配內存。 Node結構不會自動分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.