c语言 - 链表中节点的动态内存分配



为什么当我必须声明指向节点(头)的指针时,我还必须为其分配malloccalloc内存?我看到生成列表的代码(未在此处导入)也运行良好,无需为其分配内存,只需声明node *head.

typedef struct str_node{
int data;
struct str_node *next;
}node;
int main(){
node *head;
head = (node*) malloc(sizeof(node));
head = NULL;

为什么当我像上面这样分配内存时,我必须写(node*)?自从我在头上做以来,它不是已经分配给结构节点了吗?这行代码到底是什么意思?此外,当我写head = NULL时,我是否将指针头的地址设置为 NULL 还是什么?

此代码片段

node *head;
head = (node*) malloc(sizeof(node));
head = NULL;

产生内存泄漏。

起初,为node类型的对象分配了内存,并将其地址分配给指针head

head = (node*) malloc(sizeof(node));

然后指针的值立即被覆盖。

head = NULL;

结果,分配的内存的地址丢失,并且无法释放分配的内存。

代码片段没有任何意义。写就足够了

node *head = NULL;

在这种情况下,您最初将有一个空列表。

为什么当我像上面这样分配内存时,我必须写入(node*)?

函数malloc返回类型为void *的指针。可以将void *类型的指针分配给任何其他对象类型的指针。所以在 C 中,强制转换是多余的。

在C++中,必须显式地将类型void *的指针强制转换为对象指针的类型,该指针的类型void *类型分配给

该指针。

此外,当我写头 = NULL 时,我设置了指针的地址 前往空还是什么?

您没有设置指针本身的地址。指针由编译器分配,并具有自动存储持续时间。将类型为node *的变量head的值设置为 NULL。

在 C 中,指针是值,就像整数一样。当你写:

int a;
a = 3;

将值 3 存储到变量a中。

当你写:

int* p;
p = NULL;

将值NULL存储到变量p中。指针没有什么特别之处。赋值不以任何方式依赖于p的值,即它可能指向或不指向什么。(在这种情况下,它不指向任何内容,但这无关紧要。

malloc返回一个指向内存区域的指针,如上所述,内存区域是一个值。指针没有固有元数据;malloc不需要超出内存区域大小的任何信息。特别是,它不知道(或关心)内存区域的用途。生成该值后,您可以根据需要处理它,例如:

int* p;
p = malloc(sizeof *p);

由于p被声明为指向int的指针,因此期望p指向的内存可以容纳int。(目前还没有,但可以。但是你可以传递指针(作为一个值),而不会对存储在所指向的内存中的整数(如果有的话)产生任何影响。例如,之后

int* q = p;

qp指向同一内存。

如果您发现其中有任何令人困惑的内容,可能是因为您希望指针不是简单值。然而,它们是简单的价值观,你需要一个基于这个简单现实的心智模型。

> Malloc 用于分配指定大小的内存块,即在这种情况下,它是链表中的"项目"(sizeof(node))。这可用于允许链表增长。

(node*) 用于分配内存类型。 来自GeeksForGeeks的示例

我建议阅读此 https://www.geeksforgeeks.org/dynamic-memory-allocation-in-c-using-malloc-calloc-free-and-realloc/它将解释一些基本原理。

最后回答这个问题"为什么当我必须声明指向节点(头)的指针时,我还必须为 malloc 或 calloc 分配内存?

指针将编译器指向内存地址,因此当您使用 malloc 声明内存的一部分时,您需要指向该内存的开头,以便您可以访问它(因此您需要指定大小以便您知道读/写多远)。

最新更新