链表中节点的动态内存分配
Dynamic memory allocation for node in linked list
为什么当我必须声明一个指向节点(头)的指针时,我还必须使用 malloc
或 calloc
为它分配内存?我看到生成列表(未在此处导入)的代码在没有为其分配内存并且仅声明 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;
在这种情况下,您最初会有一个空列表。
And why when I allocate memory like above i have to write (node*)?
函数 malloc
returns 类型为 void *
的指针。 void *
类型的指针可以分配给任何其他对象类型的指针。所以在 C 中,强制转换是多余的。
在 C++ 中,您已显式地将 void *
类型的指针转换为 void *
类型的指针所分配到的对象指针的类型。
Moreover when I write head = NULL am I set the address of the pointer
head to NULL or what?
您没有设置指针本身的地址。该指针由编译器分配,具有自动存储期。您将类型为 node *
的变量 head
的值设置为 NULL。
Malloc 用于分配指定大小的内存块,即在这种情况下它是 (sizeof(node)),它是链表中的 'item'。这可用于让您的链接列表增长。
(node*)用于分配内存类型。
Example from GeeksForGeeks
我推荐阅读这篇文章https://www.geeksforgeeks.org/dynamic-memory-allocation-in-c-using-malloc-calloc-free-and-realloc/
它将解释一些基础知识。
终于回答这个问题“为什么当我必须声明一个指向节点(头)的指针时,我还必须使用 malloc 或 calloc 为它分配内存?”。
一个指针将编译器指向一个内存地址,因此当您使用 malloc 声明一段内存时,您需要指向该内存的开头以便您可以访问它(因此您需要指定大小以便您知道到 read/write).
有多远
在 C 中,指针是值,就像整数一样。当你写:
int a;
a = 3;
您将值 3 存储到变量 a
。
当你写:
int* p;
p = NULL;
您将值 NULL
存储到变量 p
中。 指针没有什么特别之处。赋值不以任何方式取决于 p
的值,即它可能指向或可能不指向的内容。 (在这种情况下,它没有指向任何内容,但这无关紧要。)
malloc
returns 指向内存区域的指针,如上所述,它是一个值。指针没有内在的元数据; malloc
不需要超出内存区域大小的任何信息。特别是,它不知道(或关心)内存区域将用于什么。一旦产生了那个值,你就可以按照你认为合适的方式处理它,例如:
int* p;
p = malloc(sizeof *p);
由于 p
被声明为指向 int
的指针,因此预计 p
指向的内存可以容纳 int
。 (它还没有,但它可以。)但是你可以传递指针(作为一个值)而不会对存储在指向的内存中的整数(如果有的话)产生任何影响。例如,在
之后
int* q = p;
q
和p
指向同一个内存。
如果您对此感到困惑,那可能是因为您期望指针不是简单值。但是,它们是简单的值,您需要一个基于简单现实的心智模型。
为什么当我必须声明一个指向节点(头)的指针时,我还必须使用 malloc
或 calloc
为它分配内存?我看到生成列表(未在此处导入)的代码在没有为其分配内存并且仅声明 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;
在这种情况下,您最初会有一个空列表。
And why when I allocate memory like above i have to write (node*)?
函数 malloc
returns 类型为 void *
的指针。 void *
类型的指针可以分配给任何其他对象类型的指针。所以在 C 中,强制转换是多余的。
在 C++ 中,您已显式地将 void *
类型的指针转换为 void *
类型的指针所分配到的对象指针的类型。
Moreover when I write head = NULL am I set the address of the pointer head to NULL or what?
您没有设置指针本身的地址。该指针由编译器分配,具有自动存储期。您将类型为 node *
的变量 head
的值设置为 NULL。
Malloc 用于分配指定大小的内存块,即在这种情况下它是 (sizeof(node)),它是链表中的 'item'。这可用于让您的链接列表增长。
(node*)用于分配内存类型。 Example from GeeksForGeeks
我推荐阅读这篇文章https://www.geeksforgeeks.org/dynamic-memory-allocation-in-c-using-malloc-calloc-free-and-realloc/ 它将解释一些基础知识。
终于回答这个问题“为什么当我必须声明一个指向节点(头)的指针时,我还必须使用 malloc 或 calloc 为它分配内存?”。
一个指针将编译器指向一个内存地址,因此当您使用 malloc 声明一段内存时,您需要指向该内存的开头以便您可以访问它(因此您需要指定大小以便您知道到 read/write).
有多远在 C 中,指针是值,就像整数一样。当你写:
int a;
a = 3;
您将值 3 存储到变量 a
。
当你写:
int* p;
p = NULL;
您将值 NULL
存储到变量 p
中。 指针没有什么特别之处。赋值不以任何方式取决于 p
的值,即它可能指向或可能不指向的内容。 (在这种情况下,它没有指向任何内容,但这无关紧要。)
malloc
returns 指向内存区域的指针,如上所述,它是一个值。指针没有内在的元数据; malloc
不需要超出内存区域大小的任何信息。特别是,它不知道(或关心)内存区域将用于什么。一旦产生了那个值,你就可以按照你认为合适的方式处理它,例如:
int* p;
p = malloc(sizeof *p);
由于 p
被声明为指向 int
的指针,因此预计 p
指向的内存可以容纳 int
。 (它还没有,但它可以。)但是你可以传递指针(作为一个值)而不会对存储在指向的内存中的整数(如果有的话)产生任何影响。例如,在
int* q = p;
q
和p
指向同一个内存。
如果您对此感到困惑,那可能是因为您期望指针不是简单值。但是,它们是简单的值,您需要一个基于简单现实的心智模型。