![](/img/trans.png)
[英]Value of struct variable changes after malloc of other variable of same struct
[英]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;
此示例的結果與第一個示例相同。 它只是寫得有點不同,即n1
的next
指針被分配為指向一個新的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.