使用 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.

的指针