【问题标题】:Linked list not working if I don't declare the helper variable as global如果我不将辅助变量声明为全局,则链接列表不起作用
【发布时间】:2020-03-06 15:23:45
【问题描述】:

我正在编写一个程序来创建一个单链表。我正在使用两个指针变量,其中一个被命名为“start”,它指向列表的第一个节点,另一个我正在使用的指针变量被命名为“t”。我将此指针用作辅助变量,它有助于在不影响开始的情况下遍历列表。
该程序已成功编译,但我面临的问题是在运行时它只允许我将一个节点添加到列表中。之后,如果我尝试添加另一个节点,则在输入该节点的数据后执行停止。
我尝试了几件事,但只有一个有效。如果我将“辅助指针变量”声明为全局,则程序开始运行良好。
为什么会发生这种情况?
我只在函数中使用辅助指针变量“t”来遍历列表,它甚至没有与程序中的另一个函数通信。

有人能解释一下为什么它只适用于全局声明吗?

这是函数的代码->

void insert()
{

    struct node *newnode;
    struct node *t; //<------this is the helper variable if I declare this locally
                            //then the problem occurs in the run time.                                  
    newnode = create();
    printf("Enter data ");
    scanf("%d",&newnode->info); 
    //printf("Node info = %d",newnode->info);
    if(start==NULL) 
    {
        start=newnode;  <------ this is that start variable which is declared above globally
        start->next=NULL;
        t=newnode;
    }
    else
    {
        t->next=newnode;
        t=newnode;
        t->next=NULL;       
    }   
    printf("%d successfully added to the list.",newnode->info);
}

【问题讨论】:

  • 遇到t-&gt;next=newnode;这行,t指向哪里?
  • 请创建一个minimal reproducible example。这包括提供导致所描述问题的示例输入。
  • 在“t->next=newnode;”结构体中的“next”指针开始指向最新创建的节点

标签: c pointers data-structures linked-list global-variables


【解决方案1】:

函数开头的变量 t 是一个悬空指针,即它不能被取消引用。 尝试将其放在 t-&gt;next=newnode; 之前的 else 块中

t = start;
while(t->next)
    t = t->next;

当你将它声明为全局(或静态工作)时,你让它记住存储在其中的最后一个值,因此每次它不会以悬空指针启动。

【讨论】:

  • 使指针静态工作!但我不熟悉悬空指针和取消引用的概念,你能解释一下这里到底发生了什么吗?
  • 当你在函数中声明一个指针时,它最初包含一些随机值或垃圾值。因此,您实际上无法访问该内存,因为它未分配。这种指针称为悬空指针。取消引用是访问指针指向的内存,您可以使用 * 或 -> 运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多