C语言 尝试使用递归反向打印链表数据时出现分段错误



>我已经创建了节点的链接列表。并希望使用递归技术反向打印每个节点的数据。我得到了工作以及段错误代码。我试图了解段错误代码中的实际问题。

实际上,我尝试使用GDB进行调试,但我不知道如何对此进行故障排除。任何线索都将有助于清楚地理解递归。

#include <stdio.h>
#include <stdlib.h>
typedef struct node {
        char c;
        struct node *next;
} node_t;
node_t *head = NULL;
void insert_list(node_t *node)
{
    static node_t *temp = NULL;
    if (!head) {
        head = node;
        //temp = node;
    }
    else {
        temp->next = node;
    }
    temp = node;
}
void create_list(char c)
{
    node_t *temp = NULL;
    temp = malloc(sizeof(node_t));
    if (temp) {
        temp->c = c;
        temp->next = NULL;
        insert_list(temp);
    }
    else
        return;
}
void print_list_reversely(node_t *temp)
{
    if (!temp)
        return;
    //print_list_reversely(temp->next); /* Working piece */
    temp = temp->next; /* This and next line together*/
    print_list_reversely(temp); /* Causing SEGFAULT */
    printf("data is %cn", temp->c);
    return;
}
int main()
{
    create_list('a');   
    create_list('b');   
    create_list('c');
    print_list_reversely(head);
    return 0;
}

经过一些GDB调试后,得到了以下信息:

A( print_list_reversely(临时>下一个(;

Breakpoint 4, print_list_reversely (temp=0x0) at create.c:40
40      if (!temp)
(gdb) p temp
$5 = (node_t *) 0x0
(gdb) n
41          return;
(gdb) n
47  }
(gdb) n
print_list_reversely (temp=0x602050) at create.c:45
45      printf("data is %cn", temp->c);
===

====

B( 温度 = 温度>下一个; print_list_reversely(温度(;

Breakpoint 4, print_list_reversely (temp=0x0) at create.c:40
40      if (!temp)
(gdb) p temp
$3 = (node_t *) 0x0
(gdb) n
41          return;
(gdb) n
47  }
(gdb) 
print_list_reversely (temp=0x0) at create.c:45
45      printf("data is %cn", temp->c);

假设您位于最后一个节点。

//temp = temp->next; /* This and next line together*/
//print_list_reversely(temp); /* Causing SEGFAULT */
printf("data is %cn", temp->c);

tmp分配给NULL并尝试打印它NULL从而导致指针取消引用。


考虑你有如下列表

1->2->NULL

您的递归调用是

print_list_reversely(1)
           tmp = [2]
                 --->      print_list_reversely(2)
                           tmp = [NULL]
                                          --->      print_list_reversely(NULL)
                                                    return;
                           print(null->c) //Seg fault

你的方法print_list_reversely()是从第一个元素递归调用到最后一个元素的,这是预期的行为。

看到您如何定义列表,最后一个元素的下一个元素将是 NULL

如果您取消注释两个错误行(编辑:您现在取消注释它们(,则在最后一个元素上执行temp = temp->next;时,您将获得 null。然后你用printf("data is %cn", temp->c);取消引用这个指针

因此,此代码不正确且段错误。

在回调函数(或取消引用它!

递归中传递的最后一个指针温度为 NULL,因此访问 NULL 必须导致段错误

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005c1 in print_list_reversely (temp=0x0) at linked_list.c:40
40      printf("data is %cn", temp->c);
(gdb) bt
#0  0x00000000004005c1 in print_list_reversely (temp=0x0) at linked_list.c:40
#1  0x00000000004005bd in print_list_reversely (temp=0x601050) at linked_list.c:39
#2  0x00000000004005bd in print_list_reversely (temp=0x601030) at linked_list.c:39

相关内容

  • 没有找到相关文章