C 中的指针和链表 |显示崩溃

Pointers and linked list in C | Crash on display

上运行 display(),程序crashes.May是create()有问题。 我试过了,但我无法确定 problem.I 正在破坏他们的链接,但是在哪里呢?我不 know.It 是单向链表。

节点结构为

typedef struct node{
   int data;
   struct node *right;
}list;

这里是 create()

void create(list *start){
int data;
    printf("Input value : ");
    scanf("%d",&data);
    if(data==0){
        start=NULL;
        return;
    }
    else{
        start=(list*)malloc(sizeof(list));
        start->data=data;
        create(start->right);
    }
}

而 display() 是

void display(list *start){
    printf("%d",start->data);
    if(start->right==NULL)return;
    display(start->right);
}

首先,在 create() 函数中 start 应该是 list** 类型,如果你想改变应该影响调用函数 main() 函数,否则它只是按值调用。

void create(list **start) {
  /*some code */
}

其次,你的 linking 节点的递归逻辑是正确的,因为每次 start 指向新的内存位置,每次旧内存丢失,所以没有 link节点。

所以多取temp类型的list指针变量。 create() 函数看起来像

void create(list **start,list *new){
        int data;
        printf("Input value : ");
        scanf("%d",&data);
        if(data != 0){
                new = malloc(sizeof(list));/*allocate memory */
                new->data = data;/*put the data */
                new->right  = *start; /*new node right should be head ptr */
                *(start) = new; /*update the head ptr */
                create(start,new);
        }
        else
                return;
}

然后从 main() 像这样调用 create()

int main(void) {
        list *head_ptr = NULL, *temp = NULL;
        create(&head_ptr,temp);
        display(head_ptr);
        return 0;
}

这里的问题是 create() 分配了新节点但丢失了指向它们的指针,这是内存泄漏的完美示例。

发生这种情况,因为当您将指针传递给函数时,您传递的是它的值,而局部参数只是堆栈上具有该值的东西 - 局部参数与您传递给函数的指针不是同一个指针函数,它只有相同的值。

所以当你分配新节点时,你让本地指针指向新节点,而不是你传递给函数的指针,当函数退出时,这个本地指针不再存在,你失去了对定位内存 - 发生内存泄漏。

那么如何更改从函数内部传递给函数的指针?很简单 - 只需将指针的地址传递给函数即可。 当你想改变一些变量时,你让一个指针指向它的地址,然后你取消引用 pointer.Here 你会做同样的事情 - 获取指针的地址并取消引用指向它的双指针。 只需要这样的小改动:

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int data;
    struct node *right;
}list;

void create(list **start){
    int data;
        printf("Input value : ");
        scanf("%d",&data);
        if(data==0){
            start=NULL;
            return;
        }
        else{
            *start=(list*)malloc(sizeof(list));
            (*start)->data=data;
            create(&(*start)->right);
        }
}

void display(list *start){
    printf("%d",start->data);
    if(start->right==NULL)return;
    display(start->right);
}


int main(void){
    list *LIST=NULL;

    create(&LIST);
    display(LIST);
    return 0;
}