簡體   English   中英

在為該結構本身調用 malloc 之后,是否需要為該結構中的其他字段調用 malloc()?

[英]Do I need to call malloc() for other field in a struct after calling malloc for that struct itself?

假設我有一個類型 node_t

typedef struct node{
    char* value;
    struct node *next;
}node_t;

當我想創建一個名為 n1 的新 node_t 指針時,我調用 malloc

node_t *n1 = malloc(sizeof(node_t));

現在我想訪問和使用 n1 中的其他字段:value,接下來,我是否必須再次為這些指針調用 malloc,如下所示:

n1->value = malloc(sizeof(char));
n1->next = malloc(sizeof(node_t));

或者在創建 n1 時第一次調用 malloc() 已經做了所有這些事情?

我是否必須再次為這些指針調用 malloc

這取決於您想如何使用這些成員。

當您 malloc 一個node_t您將獲得用於存儲 1) char指針和 2) node_t指針的node_t 您可以將這些指針設置為指向其他現有對象。 但是您也可以將這些指針設置為指向新的(動態分配的)對象。

示例 1

node_t *n1 = malloc(sizeof *n1);
assert(n1 != NULL);
n1->value = "Hello world";
n1->next = NULL;

node_t *n2 = malloc(sizeof *n2);
assert(n2 != NULL);
n2->value = "Have fun";
n2->next = NULL;

n1->next = n2;  // Create a linked list

在這個例子中, node_t任何成員都沒有直接的 malloc 。 成員只是設置為指向其他對象。

示例 2

node_t *n1 = malloc(sizeof *n1);
assert(n1 != NULL);
n1->value = "Hello world";

n1->next = malloc(sizeof *n1->next);
assert(n1->next != NULL);
n1->next->value = "Have fun";
n1->next->next = NULL;

此示例的結果與第一個示例相同。 它只是寫得有點不同,即n1next指針被分配為指向一個新的node_t而不是n2對象。

示例 3

char *str1= "Hello world";
char *str2= "Have fun";

node_t *n1 = malloc(sizeof *n1);
assert(n1 != NULL);
n1->value = malloc(1 + strlen(str1));
strcpy(n1->value, str1);  // Copy the string

n1->next = malloc(sizeof *n1->next);
assert(n1->next != NULL);
n1->next->value = malloc(1 + strlen(str2));
strcpy(n1->next->value, str2);  // Copy the string
n1->next->next = NULL;

這里的value指針被設置為指向一個新的 malloc 對象,並且一個字符串的副本被放置在該對象中。

所以 - 重復 - 是否要為成員分配內存取決於您想如何使用該結構。

暫無
暫無

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

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