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

标签 c

假设我有一个类型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;

此示例的结果与第一个示例相同。它只是写得有点不同,即 n1next 指针被分配指向一个新的 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/

相关文章:

c++ - 将C union 转换为C++ union

c - 用于在二进制文件中随机改组字节 block 的 Unix 命令行工具?

c++ - gcc 和 g++ 库搜索路径

c - 运行时检查失败 #3 - T

c - 如何在C++中动态获取工具提示的高度和宽度?

c++ - printf 的渐近复杂度

c - 指向数组的指针错误

c - 在 Windows 中使用 GCC 或 Clang 强制 LP64 数据模型

c - 简单函数的段错误

c - 未指定长度的数组的问题