使用 malloc 初始化指向结构的指针
Initializing a pointer to a struct with malloc
这可能是一个非常简单的解决方案的问题,但我无法理解它...我正在尝试使用结构为学校项目实现链表,但是当我初始化第一个节点时, malloc 似乎完全没有作用
到目前为止,这是我的代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node
{
int data;
Node *next;
};
void init_List(Node *head, int data)
{
head = (Node*)malloc(sizeof(Node));
if(head == NULL)
{
printf("Memory Allocation Error");
return;
}
head->data = data;
head->next = NULL;
}
int main()
{
Node *head = NULL;
int N;
printf("N: ");
scanf("%d", &N);
init_List(head, N);
printf("%d", head->data);
}
无论我读取什么数字来使我的节点的第一个数据打印为 cero。不知道会发生什么。
感谢您的帮助!
当您将 head
传递给函数 init_List
时,会生成 head
的本地副本,然后将内存分配给该本地指针。在main
中,head
仍然指向NULL
。
您需要在函数参数中使用指向指针的指针。
void init_List(Node **head, int data)
{
*head = malloc(sizeof(Node));
if(*head == NULL)
{
printf("Memory Allocation Error");
return;
}
(*head)->data = data;
(*head)->next = NULL;
}
你的函数调用应该像
init_List(&head, N);
另请注意,不要将 return 值转换为 malloc
。
事实上你已经在语句
中初始化了列表
Node *head = NULL;
因此,您需要的是一个将列表中的整数推到前面的函数。该函数可以如下所示
void push_front( Node **head, int data )
{
Node *tmp = malloc( sizeof( Node ) );
if ( tmp != NULL )
{
tmp->data = data;
tmp->next = *head;
*head = tmp;
}
else
{
printf( "Memory Allocation Error" );
}
}
并且函数的调用方式如下
push_front( &head, n );
考虑到用一个大写字母命名变量是个坏主意。
至于你的问题,那么函数参数就是它们的局部变量。因此,对局部变量的任何更改都不会影响原始参数。函数处理其参数的副本。
所以在函数中
void init_List(Node *head, int data)
{
head = (Node*)malloc(sizeof(Node));
//...
局部变量已更改head
。尽管它与用于调用函数的参数同名,但局部变量的任何更改都不会影响参数。原参数不会改变。您必须将参数声明为指向指针 Node **head
.
的指针
这可能是一个非常简单的解决方案的问题,但我无法理解它...我正在尝试使用结构为学校项目实现链表,但是当我初始化第一个节点时, malloc 似乎完全没有作用
到目前为止,这是我的代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node
{
int data;
Node *next;
};
void init_List(Node *head, int data)
{
head = (Node*)malloc(sizeof(Node));
if(head == NULL)
{
printf("Memory Allocation Error");
return;
}
head->data = data;
head->next = NULL;
}
int main()
{
Node *head = NULL;
int N;
printf("N: ");
scanf("%d", &N);
init_List(head, N);
printf("%d", head->data);
}
无论我读取什么数字来使我的节点的第一个数据打印为 cero。不知道会发生什么。 感谢您的帮助!
当您将 head
传递给函数 init_List
时,会生成 head
的本地副本,然后将内存分配给该本地指针。在main
中,head
仍然指向NULL
。
您需要在函数参数中使用指向指针的指针。
void init_List(Node **head, int data)
{
*head = malloc(sizeof(Node));
if(*head == NULL)
{
printf("Memory Allocation Error");
return;
}
(*head)->data = data;
(*head)->next = NULL;
}
你的函数调用应该像
init_List(&head, N);
另请注意,不要将 return 值转换为 malloc
。
事实上你已经在语句
中初始化了列表Node *head = NULL;
因此,您需要的是一个将列表中的整数推到前面的函数。该函数可以如下所示
void push_front( Node **head, int data )
{
Node *tmp = malloc( sizeof( Node ) );
if ( tmp != NULL )
{
tmp->data = data;
tmp->next = *head;
*head = tmp;
}
else
{
printf( "Memory Allocation Error" );
}
}
并且函数的调用方式如下
push_front( &head, n );
考虑到用一个大写字母命名变量是个坏主意。
至于你的问题,那么函数参数就是它们的局部变量。因此,对局部变量的任何更改都不会影响原始参数。函数处理其参数的副本。
所以在函数中
void init_List(Node *head, int data)
{
head = (Node*)malloc(sizeof(Node));
//...
局部变量已更改head
。尽管它与用于调用函数的参数同名,但局部变量的任何更改都不会影响参数。原参数不会改变。您必须将参数声明为指向指针 Node **head
.