假设我有一个类型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 和 next,我是否必须再次为这些指针调用 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) char
指针和 2) 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
指针被分配指向一个新的 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/