![](/img/trans.png)
[英]try to find middel but program crash linked list in c with two pointers
[英]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.