使用malloc初始化指向结构的指针

时间:2015-06-21 18:10:51

标签: c pointers linked-list

这可能是一个非常简单的解决方案的问题,但我无法理解它...我正在尝试使用结构实现学校项目的链表,但是当我初始化它时第一个节点,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。不知道会发生什么。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

当您将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);  

另请注意,请勿转换malloc的返回值。

答案 1 :(得分:0)

事实上,您已经在声明

中初始化了列表
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的指针。