gpt4 book ai didi

c - 在为该结构本身调用 malloc 之后,是否需要为该结构中的其他字段调用 malloc()?

转载 作者:行者123 更新时间:2023-12-04 08:56:57 30 4
gpt4 key购买 nike

假设我有一个类型 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() 已经做了所有这些事情?

最佳答案

do I have to call malloc for these pointer again


这取决于您想如何使用这些成员。
当您 malloc 时 node_t您将获得用于存储 1) a char 的内存指针和 2) a 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;
此示例的结果与第一个示例相同。它只是写得有点不同,即 next n1的指针被分配指向一个新的 malloc'ed 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 对象和一个 复制 一个字符串被放置在该对象中。
所以 - 重复 - 是否要为成员分配内存取决于您想如何使用结构。

关于c - 在为该结构本身调用 malloc 之后,是否需要为该结构中的其他字段调用 malloc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63769711/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com