繁体   English   中英

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

[英]Pointers and linked list in C | Crash on display

在运行display()时,程序崩溃。create()可能存在问题。 我曾尝试过,但无法确定问题所在。我正在破坏它们的链接,但是在哪里? 我不知道。这是一个单链表。

节点结构是

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()函数中,如果您希望更改影响调用main()函数,则start应该是list**类型,否则它只是按值调用。

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

其次,链接节点的递归逻辑是正确的,因为每次start指向新的内存位置,每次丢失旧的内存,因此节点之间没有链接。

因此,请使用list类型的额外temp指针变量。 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()分配了新节点,但丢失了指向它们的指针,这是内存泄漏的完美示例。

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

因此,当您分配新节点时,您使本地指针指向新节点,而不是传递给该函数的指针,并且当函数退出时,该本地指针不再存在,并且您将丢失对已定位内存的引用-内存泄漏发生。

那么如何从函数内部更改传递给函数的指针呢?很简单-只需将指针的地址传递给函数即可。 当您想更改某个变量时,先将其指向一个指向其地址的指针,然后再取消对该指针的引用。在这里您将执行相同操作-获取指针的地址并取消引用指向该指针的双指针。 只需进行较小的更改,如下所示:

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM